Ityক্য - কীভাবে একটি জাহাজকে 2D টপ-ডাউন গেমের পয়েন্টে বাস্তবসম্মতভাবে স্থানান্তরিত করা যায়


14

আমি একটি নৌকো জাহাজটি সেই স্থানে নিয়ে যাওয়ার চেষ্টা করছি যেখানে আমি মাউসের সাহায্যে ক্লিক করেছি। এই চলাচলটি বাস্তবসম্মত হওয়া উচিত (জাহাজটি যেদিকে ফিরে আসে তার পিছনে দিকের) তাই যদি মাউস ক্লিকটি বাম দিকে থাকে এবং জাহাজের সামনে জাহাজটি পরে ডানদিকে ঘোরার জন্য একটি বক্ররেখা নিয়ে সেখানে চলে যায়

কেউ যদি এই সমস্যাটির সাথে আমাকে সহায়তা করতে পারে তবে আমি খুশি হব জাহাজ চলাচল


1
আপনার চিত্র যেমন পালকে চিত্রিত করে বলে মনে হচ্ছে: বাতাসকে কি আমলে নেওয়া উচিত? কিছু চালাকি ভুল বাতাস বা এর অভাব নিয়ে করা অসম্ভব।
কেউ

আরো বিন্দু, বাস্তবসম্মত সুদর্শন পালতোলা জাহাজ আন্দোলন সত্যিই প্রয়োজন একাউন্টে বাতাস গ্রহণ; জাম্পিং বাস্তবায়নের সময় এটিকে উপেক্ষা করা প্রায় অভিকর্ষকে উপেক্ষা করার মতোই হবে। আপনার অগত্যা একটি বিশেষভাবে বায়ু মডেলের প্রয়োজন হবে না, তবে আপনার মনে রাখতে হবে যে আপনার জাহাজগুলি তাদের পাল দিয়ে বাতাসে প্রায় ধাক্কা দিচ্ছে (এবং তাদের পাতলা এবং ঝাঁকুনির বিপরীতে জল)। বিশেষত, জাহাজগুলি সরাসরি উপড়ে যেতে পারে না; তারা করতে হবে বীট পরিবর্তে তাদের উপায়।
ইলমারি করোনেন

সাধারণত একটি "গোটো পয়েন্ট" এ আবর্তন পর্ব এবং এগিয়ে চলার ধাপে বিভক্ত করা যেতে পারে। একই অ্যাপ্রোচ নিন তবে রোটেশনে একটি সামনের আন্দোলন চাপান। ঘূর্ণনের প্রতিটি এক্স রেড উদাহরণ নৌকাটি y মিটারের সামনে নিয়ে যান
dnkron.vs.drones

উত্তর:


7

এই পৃষ্ঠাটি দেখুন

বাস্তবসম্মত টার্ন যুক্ত করা হচ্ছে

পরবর্তী পদক্ষেপটি হ'ল আমাদের ইউনিটগুলির জন্য বাস্তব বাঁকানো বাঁকগুলি যুক্ত করা, যাতে তারা প্রতিবার যখন মোড় নেওয়ার দরকার হয় ততক্ষণে হঠাৎ করে দিক পরিবর্তন করতে দেখা যায় না। একটি সহজ সমাধান হ'ল আকস্মিক কোণগুলিকে ঘুরিয়ে দেওয়ার জন্য একটি স্প্লাইন ব্যবহার করে। যদিও এটি কিছু নান্দনিক উদ্বেগের সমাধান করে, এটি এখনও বেশিরভাগ ইউনিটের জন্য শারীরিকভাবে খুব অবাস্তব আন্দোলনের ফলস্বরূপ। উদাহরণস্বরূপ, এটি একটি ট্যাঙ্কের আকস্মিক কোণে একটি শক্ত বাঁকায় পরিবর্তিত হতে পারে, তবে বাঁকানো বাঁকটি ট্যাঙ্কটি কার্য সম্পাদন করতে পারে তার চেয়ে এখনও আরও শক্ত would

আরও ভাল সমাধানের জন্য, আমাদের প্রথমটি জানতে হবে আমাদের ইউনিটের টার্নিং ব্যাসার্ধ। ব্যাসার্ধ ঘুরিয়ে দেওয়া মোটামুটি সহজ ধারণা: আপনি যদি নিজের গাড়িতে একটি বড় পার্কিং লটে থাকেন এবং চাকাটিকে যতদূর যেতে হবে বাম দিকে ঘুরিয়ে ঘুরিয়ে চালাবেন, বৃত্তের ব্যাসার্ধটি আপনার বাঁক ব্যাসার্ধ। একটি ভলসওগেন বিটলের বাঁক ব্যাসার্ধটি একটি বড় এসইউভির তুলনায় যথেষ্ট ছোট হবে এবং কোনও ব্যক্তির বাঁক ব্যাসার্ধ বড়, কাঠের ভালুকের চেয়ে যথেষ্ট কম হবে।

ধরা যাক যে আপনি কোনও মুহুর্তে (উত্স) এবং নির্দিষ্ট দিক নির্দেশ করেছেন এবং চিত্র 5-তে বর্ণিত হিসাবে আপনাকে অন্য কোনও বিন্দুতে (গন্তব্য) পৌঁছাতে হবে, সবচেয়ে ছোট পথটি আপনি যতদূর বাম দিকে ঘুরিয়েই পাওয়া যায় আপনি সরাসরি গন্তব্যের দিকে নির্দেশ না করা পর্যন্ত একটি চেনাশোনাতে যেতে পারেন এবং তারপরে এগিয়ে যেতে পারেন বা ডানদিকে ঘুরিয়ে একই জিনিসটি চালিয়ে যেতে পারেন। চিত্র 5: উত্স থেকে গন্তব্যের সবচেয়ে সংক্ষিপ্ততম পথ নির্ধারণ করা।

চিত্র 5-এ সংক্ষিপ্ততম রুটটি নীচে পরিষ্কারভাবে সবুজ রেখা। এই পাথটি কিছু জ্যামিতিক সম্পর্কের কারণে গণনা করা মোটামুটি সোজা বলে প্রমাণিত হয়েছে, যা চিত্র 6 এ চিত্রিত হয়েছে।

চিত্র 6: পথের দৈর্ঘ্য গণনা করা হচ্ছে।

প্রথমে আমরা পয়েন্ট পি এর অবস্থান গণনা করি, যা আমাদের বাঁকানো বৃত্তের কেন্দ্র, এবং সর্বদা প্রারম্ভিক বিন্দু থেকে দূরে ব্যাসার্ধ হয়। যদি আমরা আমাদের প্রাথমিক দিক থেকে ডান দিকে ঘুরতে থাকি তবে এর অর্থ পি এর উত্স থেকে (প্রাথমিক_নির্দেশ - 90) এর কোণে রয়েছে, সুতরাং:

angleToP = initial_direction - 90
P.x = Origin.x + r * cos(angleToP)
P.y = Origin.y + r * sin(angleToP)

এখন যেহেতু আমরা কেন্দ্রের পয়েন্ট P এর অবস্থান জানি, আমরা চিত্র থেকে h হিসাবে দেখানো পি থেকে গন্তব্যের দূরত্ব গণনা করতে পারি:

dx = Destination.x - P.x
dy = Destination.y - P.y
h = sqrt(dx*dx + dy*dy)

এই মুহুর্তে আমরা এটিও পরীক্ষা করে দেখতে চাই যে গন্তব্যটি বৃত্তের মধ্যে নেই, কারণ এটি যদি হয় তবে আমরা কখনই এটিতে পৌঁছতে পারিনি:

if (h < r)
    return false

এখন আমরা বিভাগের d এর দৈর্ঘ্য গণনা করতে পারি, যেহেতু আমরা ইতিমধ্যে h এবং r নামের ডান ত্রিভুজটির অন্য দুটি পক্ষের দৈর্ঘ্য জানি। আমরা ডান ত্রিভুজ সম্পর্ক থেকে কোণ নির্ধারণ করতে পারি:

d = sqrt(h*h - r*r)
theta = arccos(r / h)

অবশেষে, বৃত্তটি ছেড়ে যাওয়ার এবং সোজা রেখার শুরু করার জন্য কী বিন্দু Qটি বের করার জন্য আমাদের মোট কোণটি + জানতে হবে এবং পি থেকে গন্তব্য পর্যন্ত সহজেই কোণ হিসাবে নির্ধারিত হয়েছে:

phi = arctan(dy / dx) [offset to the correct quadrant]
Q.x = P.x + r * cos(phi + theta)
Q.y = P.y + r * sin(phi + theta)

উপরের গণনাগুলি ডান-মোড়ের পথে উপস্থাপন করে। বাম-হাতের পথটি ঠিক একইভাবে গণনা করা যায়, ব্যতীত আমরা কোণ-টোপি গণনা করার জন্য 90_ আরম্ভের_নির্দেশ যোগ করি এবং পরে আমরা ব্যবহার করি - পরিবর্তে +। উভয় গণনা করার পরে, আমরা সহজেই দেখি যে কোন পথটি ছোট and

আমাদের এই অ্যালগরিদম এবং এর পরে অনুসরণকারীগুলির বাস্তবায়নে আমরা একটি ডেটা স্ট্রাকচার ব্যবহার করি যা চারটি স্বতন্ত্র "লাইন বিভাগ" সংরক্ষণ করে, যার প্রত্যেকে প্রত্যক্ষ হয় বা বাঁকা। এখানে বর্ণিত বাঁকা পথগুলির জন্য, কেবলমাত্র দুটি বিভাগ ব্যবহার করা হয়েছে: একটি খিলান একটি সরলরেখার পরে। ডেটা স্ট্রাকচারে এমন সদস্য রয়েছে যা সেগমেন্টটি একটি আর্ক বা একটি সরল রেখা, সেগমেন্টের দৈর্ঘ্য এবং তার সূচনা অবস্থান কিনা তা নির্দিষ্ট করে। বিভাগটি যদি একটি সরলরেখা হয় তবে ডেটা কাঠামোটি কোণটিও নির্দিষ্ট করে; আরাক্সের জন্য এটি বৃত্তের কেন্দ্র, বৃত্তের প্রারম্ভিক কোণ এবং আর্ক দ্বারা আবৃত মোট রেডিয়ান নির্দিষ্ট করে।

একবার আমরা দুটি পয়েন্টের মধ্যে পৌঁছানোর জন্য প্রয়োজনীয় বাঁকা পথটি গণনা করি, তবে তালিকা 2-তে দেখানো হয়েছে যে আমরা যেকোন সময় তাত্ক্ষণিকভাবে আমাদের অবস্থান এবং দিকটি সহজেই গণনা করতে পারি।

তালিকা 2. একটি নির্দিষ্ট সময়ে অবস্থান এবং ওরিয়েন্টেশন গণনা।

distance = unit_speed * elapsed_time
loop i = 0 to 3:
    if (distance < LineSegment[i].length)
        // Unit is somewhere on this line segment
        if LineSegment[i] is an arc
            //determine current angle on arc (theta) by adding or
            //subtracting (distance / r) to the starting angle
            //depending on whether turning to the left or right
            position.x = LineSegment[i].center.x + r*cos(theta)
            position.y = LineSegment[i].center.y + r*sin(theta)
        //determine current direction (direction) by adding or
        //subtracting 90 to theta, depending on left/right
        else
            position.x = LineSegment[i].start.x 
              + distance * cos(LineSegment[i].line_angle)
            position.y = LineSegment[i].start.y
              + distance * sin(LineSegment[i].line_angle)
        direction = theta
        break out of loop
    else
        distance = distance - LineSegment[i].length

4
এই উত্তরটি আসলে জাহাজগুলির পদার্থবিজ্ঞানের দিকে নজর দেয় না। আমি এটিও সমস্যাযুক্ত মনে করি যে এটি মূলত একটি লিঙ্ক এবং অন্য কোনও ওয়েবসাইটের দীর্ঘ অংশ (আমি বৈধতা সম্পর্কে অনিশ্চিত)।
কেউ

সর্বশেষে যখন আমি একটি বিদ্যমান সংস্থান সরবরাহ করেছি যা জিজ্ঞাসা করা প্রশ্নের সমাধান ছিল, তখন টার্গেট সাইটটি বন্ধ হয়ে যাওয়া ইভেন্টে আমাকে লিঙ্কটির বিষয়বস্তু অন্তর্ভুক্ত করতে বলা হয়েছিল। এখন আমাকে কন্টেন্টটি অন্তর্ভুক্ত না করার জন্য বলা হচ্ছে। আপনার মন আপ করুন।
ড্রাকো 18 গুলি আর 17 ই

3
@ ড্রাকো 18: আপনার যা করা উচিত তা হ'ল লিঙ্কযুক্ত উপাদানের প্রয়োজনীয় বিষয়গুলি নিজের কথায় সংক্ষেপে। (বা আরও ভাল, নিজের অভিজ্ঞতার ভিত্তিতে প্রশ্নের উত্তর দিন, এবং কেবল সমর্থনকারী উপাদান বা আরও পড়ার জন্য লিঙ্কগুলি ব্যবহার করুন)) সংক্ষিপ্ত উদ্ধৃতিগুলি সাধারণত ঠিক থাকে, বিশেষত এমন পরিস্থিতিতে যেখানে সেগুলি এড়ানো যায় না (উদাহরণস্বরূপ কারও সঠিক কথা উদ্ধৃত করা) শব্দ প্রকট তারা সত্যিই কিছু বলেন যে), কিন্তু একটি নিবন্ধ সুত্রে অংশ সত্যিই পরলোক যাচ্ছে বরাত দিয়ে ন্যায্য ব্যবহার
ইলমারি করোনেন

পয়েন্টটি যদি বৃত্তের মধ্যে থাকে তবে আপনি কিছুটা বাইরে যেতে পারেন এবং ফিরে আসতে পারেন।
ব্যবহারকারী 253751

(গীত। মেটা.এসই.তে এই দুটি প্রশ্নও দেখুন )
ইলমারি করোনেন

7

সহজ সমাধান হিসাবে, ইতিমধ্যে আমি একটি মন্তব্যে বলেছি, আপনি এই অভিনয়ের চেষ্টা করতে পারেন:

আপনি এমন এক পর্যায়ে বিবেচনা করুন যেখানে আপনি জাহাজটিকে লক্ষ্যবস্তুতে নির্দেশ করুন, সেই পর্যায়ে আপনি চুমুকের জন্য একটি ঘূর্ণন প্রয়োগ করবেন তবে একটি অগ্রগামী আন্দোলনও করুন। জাহাজটি ইতিমধ্যে টার্গেটের মুখোমুখি হয়ে গেলে আপনি পুরো ফরোয়ার্ড গতি প্রয়োগ করতে পারেন। আমি love2d এ একটি পরীক্ষার ব্যবস্থা করেছি, এখানে শিপ আপডেট পদ্ধতিটি অনুসরণ করুন।

turnAngSpeed = 0.4 --direction changing speed
ForwordSpeed = 40 -- full forward speed
turnForwordSpeed = ForwordSpeed *0.6 -- forward speed while turning
function ent:update(dt)
            dir = getVec2(self.tx-self.x,self.ty-self.y) -- ship --> target direction (vec2)
            dir = dir.normalize(dir) --normalized                               
            a= dir:angle() - self.forward:angle() --angle between target direction e current forward ship vector
            if (a<0) then
             a=a+math.pi *2 -- some workaround to have all positive values
            end

            if a > 0.05 then -- if angle difference 
                if a < math.pi then
                    --turn right
                    self.forward = vec2.rotate(self.forward,getVec2(0,0),turnAngSpeed * dt)
                else
                    --turn left
                    self.forward = vec2.rotate(self.forward,getVec2(0,0),-turnAngSpeed * dt)
                end             
                --apply turnForwordSpeed
                self.x = self.x+ self.forward.x * turnForwordSpeed * dt
                self.y = self.y+ self.forward.y * turnForwordSpeed * dt
            else 
                --applly ForwordSpeed
                self.x = self.x+ self.forward.x * ForwordSpeed * dt
                self.y = self.y+ self.forward.y * ForwordSpeed * dt
            end
end

এখানে চিত্র বর্ণনা লিখুন

উদাহরণ অ্যানিমেশনটি এমন একটি কেস দেখায় (চূড়ান্ত লুপ) যেখানে জাহাজটি লক্ষ্যে পৌঁছতে পারে না, কারণ টার্নিং এবং ফরোয়ার্ড গতির সংমিশ্রণটি খুব বড় টার্নিং ব্যাসার্ধকে সংজ্ঞায়িত করে, এই ক্ষেত্রে মৌমাছি ব্যবহারযোগ্য " turnForwordSpeed" হ্রাস করতে পারে বা এটি আরও ভাল তৈরি করতে পারে কোণ দূরত্ব ( a) এবং লক্ষ্য দূরত্বের উপর নির্ভরশীল ।


এটি একটি দুর্দান্ত উত্তর, তবে এটি অপের পক্ষে যথেষ্ট বাস্তববাদী বা নাও হতে পারে। বলুন, গাড়ি, জাহাজের সত্যই "টার্নিং ব্যাসার্ধ" নেই: বেশিরভাগ স্ব-ইঞ্জিন (ইঞ্জিন / হিউম্যান) চালিত জাহাজগুলি মূলত একটি ডাইম চালু করতে পারে, যখন নৌযানগুলি বাতাসের উপর নির্ভর করে এবং প্রকৃতপক্ষে একটি নেতিবাচক কার্যকর বাঁক থাকতে পারে ব্যাসার্ধটি যখন টেচিং করা হয় তখন এই অর্থে যে বাম দিকে বাম দিকে ঘোরানো জাহাজটি ডানদিকে প্রবাহিত করতে পারে। জাহাজগুলির যা আছে তা হ'ল জড়তা (এবং টানুন): তারা তাত্ক্ষণিকভাবে ঘুরিয়ে বা সরাতে পারে না এবং একবার চলন্ত বা ঘুরলে কিছুটা সময় নেয় এবং থামতে বাধ্য হয়। তবুও, একটি +1 করুন।
ইলমারি করোনেন

উত্তরের জন্য তোমাকে অনেক ধন্যবাদ!!! :) আপনি স্যার, আমার নায়ক!
ডেভিডটি

@ ডেভিডটি তার উত্তরটি স্বীকৃত উত্তর হিসাবে চিহ্নিত করার কথা বিবেচনা করুন, যদি এটি সন্তুষ্টভাবে আপনার সমস্যা সমাধান করতে সক্ষম হয়। :)
গে

-2

ইউনিটি নাভ জাল সিস্টেম, এটি সম্ভবত আপনি যা করতে চান এনএভি এজেন্টের মানগুলির সাথে কিছুটা খেলতে চান।

নাভ মেসগুলি ব্যবহার করা বেশ সহজ। এবং শুধুমাত্র উপরের ডাউন সেটআপে ব্যবহারযোগ্য (বা কমপক্ষে কেবল x / z আন্দোলনের জন্য উপলব্ধ)

একটি ন্যাভ জাল সেটআপ করার ক্ষেত্রে ইউনিটির ম্যানুয়াল পৃষ্ঠা

মূলত আপনি কোনও নেভিগেশন অঞ্চল বেক করতে যে কোনও আকারের জাল ব্যবহার করতে পারেন, এবং আপনার জিনিসগুলিতে ন্যাভ এজেন্ট যুক্ত করতে পারেন এবং নেভিগেশনের জালের আশেপাশে তাদের পথ খুঁজে পেতে পারেন have


আমি ড্র্যাকো 18 এর উত্তরটিও সে ক্ষেত্রে খুব কমই পেয়েছি। যাইহোক, আপনার একটি বাস্তব উত্তর এবং একটি মন্তব্য বেশি নয়।
কেউ

2
এটি একটি ভাল পরামর্শ তবে একটি ভাল উত্তর হতে গেলে এর বাস্তবায়নের ক্ষেত্রে সহায়তা এবং তথ্য প্রয়োজন। এটি একটি ভাল উত্তর করতে দয়া করে নাভি মেসগুলি কনফিগার করতে কিছু তথ্য যুক্ত করুন। আমি মনে করি উপরোক্ত
কমেন্টাররা এটাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.