কোনও পথে চলার সময় কীভাবে আমার চরিত্রগুলি মসৃণ করা যায় (স্থানাঙ্কের তালিকা)?


15

আমার একটি স্থানাঙ্কের সাথে একটি তালিকা আছে - এ * অ্যালগরিদম থেকে আউটপুট - এবং আমি আমার চরিত্রগুলি ঘোরানোর সাথে এই পথটি সুচারুভাবে অনুসরণ করতে চাই।

তাই আমি ভালো কিছু আছে একটি এবং আমি পেতে চাই সি

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

কিভাবে আমি এটি করতে পারব ?

সম্পাদনা

নিজেকে আরও কিছুটা পরিষ্কার করার জন্য:

আমি মসৃণ বাঁকতে আরও আগ্রহী কারণ আমি ইতিমধ্যে জানি যে কিভাবে একটি নোড থেকে অন্য নোডে যেতে হয়।

সম্পাদনা

যেহেতু অনেক লোক এই দরকারীটিকে খুঁজে পেয়েছেন (আমিও) আমি ড্যানিয়েল শিফম্যানের "কোডের প্রকৃতি" -এ লিঙ্ক পোস্ট করছি যেখানে তিনি প্রচুর গেমের এআই (এবং পদার্থবিজ্ঞান) সমস্যাগুলি নিয়ে আলোচনা করেছেন যেমন স্টিয়ারিং আচরণগুলি http://natureofcode.com/book/chapter- 6-স্বশাসিত-এজেন্ট / # chapter06_section8


প্যাথফাইন্ডিং কি অন্তর্নির্মিত ইউনিটি নয়?
joltmode

@ টম ওয়েল হ্যাঁ তবে আমি আমার সংস্করণটি যাইহোক প্রয়োগ করেছি। এই প্রশ্নের মূল বক্তব্য হ'ল পথে চলার সময় মসৃণ টার্নগুলি (আবর্তন) পাওয়া।
প্যাট্রিক

3
এই বিষয়ে গুগলের কাছে একটি দুর্দান্ত শব্দটি হ'ল 'স্টিয়ারিং বিহেভিয়ার' :)
রয় টি।

3
@RoyT। অবশ্যই ! আমি এটি কয়েক সপ্তাহ আগে পড়েছি এবং ইতিমধ্যে ভুলে গিয়েছি: / এটি দুর্দান্ত গণিত + পদার্থবিজ্ঞানের ব্যাখ্যা প্রকৃতিফোডকোড.কমের
প্যাট্রিক

1
আমি লিঙ্কটির জন্য @ প্যাট্রিককে ধন্যবাদ জানাতে চেয়েছিলাম - সত্যিই তথ্যবহুল দেখাচ্ছে এবং আমি স্টিয়ারিং আচরণের জন্য একটি ভাল উত্স অনুসন্ধান করছি।
খ্রিস্টান

উত্তর:


7

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

একবার আপনি এর মতো অপ্রয়োজনীয় প্রান্তগুলি সরিয়ে ফেললে আপনার প্রথম কেস ( এ -> বি ) সমাধান হয়ে যায়। আপনার গ্রাফের প্রান্তগুলি মসৃণ করা বিভিন্ন উপায়ে সম্পন্ন হতে পারে। সম্ভবত, হার্মাইট স্প্লাইটিংগুলি কাজ করবে (আপনার বাধার ঘনত্ব এবং টাইল-আকারের উপর নির্ভর করে)। অন্য বিকল্পটি স্টিয়ারিং আচরণগুলি হতে পারে, যেখানে আপনি বর্তমান টারপয়েন্টের দিকে যেতে শুরু করবেন, আপনি বর্তমান টার্গেট থেকে আধা টাইল দূরে থাকায় (এটি আপনার "এজেন্ট" কতটা দ্রুত চলে / পরিবর্তিত হবে তার উপর নির্ভর করে)।


9

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

তবে, প্রথম ক্ষেত্রে, একটি সমাধান রয়েছে যা উভয়ই সহজ এবং পথের মসৃণতার চেয়ে ভাল ফলাফল দেয়। একে থেটা * বলা হয় এবং এটি গ্রিডগুলিতে A * এর একটি সহজ (এবং তুলনামূলকভাবে নতুন) এক্সটেনশন যা ইউনিটগুলি গ্রিড-পয়েন্টগুলির মধ্যে যে কোনও দিকে যেতে দেয়।

থিতা * বনাম। পথ মসৃণ

একটা চমৎকার নিবন্ধ ব্যাখ্যা থীটা * (যেখান থেকে আমি উপরের ছবিতে চুরি) হল এখানে


2

আরও বেশি মানবিক বাস্তববাদী আন্দোলনে স্টিয়ারিং বিহেভিয়ার্সের সাথে সংহত করার চেষ্টা করুন। (ক্লাসিক ওপেনস্টিয়ারের সি # সংস্করণ http://sharpsteer.codeplex.com/ ) আপনি অস্টারের আউটপুট পাবেন এবং চলাচল সম্পর্কে স্টিয়ারিং আচরণের যত্ন নিতে দিন (নমুনাগুলির মধ্যে একটি কীভাবে এটি করতে পারে তা সুনির্দিষ্টভাবে দেখায়, কোনও পথ অনুসরণ করে নেভিগেট করুন)


1

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


এটিই আমি শেষ করেছিলাম।
প্যাট্রিক

1

ক্যাটমুল-রোম স্প্লিনস (@ বিমমজ্যাক দ্বারা প্রস্তাবিত এক ধরণের কিউবিক স্প্লাইন) এর সাথে আমার ভাগ্য ভাল । সেগুলির সম্পর্কে ভাল দিকটি হ'ল স্প্লাইনটি সর্বদা নিয়ন্ত্রণ পয়েন্টগুলির মধ্যে দিয়ে যায়, অন্য অনেকে তা করেন না। এর মতো কিছু বাস্তবায়ন করুন:

t    = <time*>
t12  = t + 1.0
t23  = t
t34  = t - 1.0
t123 = (t + 1.0) / 2.0
t234 = t / 2

c1 = controlpoint[0];
c2 = controlpoint[1];
c3 = controlpoint[2];
c4 = controlpoint[3];

l12 = lerp(c1, c2, t12);
l23 = lerp(c2, c3, t23);
l34 = lerp(c3, c4, t34);
position = lerp(lerp(l12, l23, t123), lerp(l23, l34, t234), t);

* সময় নিয়ন্ত্রণ পয়েন্ট 1 এবং 2 এর মধ্যে একটি মান [0,1] হল।


0

এ-> বি গ্রিডের পরিবর্তে নেভিগেশন মেস ব্যবহার করে সমাধান করা যেতে পারে। এটি প্যাথফাইন্ডিং ডেটা জেনারেশনে বড় পরিবর্তনকে বোঝায়।

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

push_dir = average( prevcell.pos, nextcell.pos ) - curcell.pos;
push_dist = cell_half_width - distance( char.pos, curcell.pos );
char.pos += push_dir * push_dist;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.