স্পেস শিপের গতিশীল থ্রাস্টার ব্যালেন্সিং


14

আমার গেমের স্পেস শিপগুলি বলতে বোঝায় যে কোনও ঘূর্ণনের সাথে যেকোন জায়গায় সংযুক্ত করে একটি নির্বিচার পরিমাণ থ্রাস্টার দিয়ে প্লেয়ার-বিল্ট। জাহাজটিকে প্রদত্ত কোণে ঘোরানোর জন্য আমার কাছে বর্তমানে কিছু নোংরা কোড রয়েছে (ত্বরণ এবং হ্রাসকারী)।

এখানে একটি প্রতিসম জাহাজের মুখোমুখি একটি উদাহরণ রয়েছে যেখানে লাল রেখার পয়েন্টগুলি বামদিকে ঘোরাতে বলা হচ্ছে।

জাহাজ

তবে, আপনি যেমন কল্পনা করবেন, খেলোয়াড়টি থ্রাস্টারগুলি কোথায় রেখেছিল তার উপর নির্ভর করে, কখনও কখনও অনাকাঙ্ক্ষিত রৈখিক বাহিনী জাহাজকে প্রভাবিত করে। এই ক্ষেত্রে, জাহাজটি এগিয়ে যেতে শুরু করে।

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

আমি এ পর্যন্ত যা নিয়ে এসেছি তা হল "টার্ন দক্ষতা" নির্ধারণ করার সূত্র যা লিনিয়ার চলাচলের ক্ষেত্রে কতটা ঘূর্ণন ঘটে।

ক - অবস্থান ভেক্টরকে থ্রাস্টার করে খ - অবস্থান ভেক্টরকে থ্রাস্টার বি ভি 1 - থ্রাস্টার থেকে একটি ভি 2 - থ্রাস্টার বি থেকে শক্তি

দক্ষতাডেলটা = a.cross (v1) / | v1 | - (এ। ক্রস (ভি 1) + বি.ক্রস (ভি 2)) / | ভি 1 + ভি 2 |

, মূলত "a.cross (v1 * t) / | v1 |" পালা দক্ষতা বলে মনে করা হচ্ছে। এবং তারপরে আমরা যুক্ত থ্রাস্টারগুলির পালা দক্ষতার দ্বারা এটি বিয়োগ করি, এটি দেখার জন্য যে নতুন থ্রাস্টারটি ফায়ার করার উপযুক্ত কিনা if

সমস্যা দেখা দেয় যখন আমি বুঝতে পারি যে থ্রাস্টারগুলি চালু / বন্ধ হওয়ার চেয়ে বেশি অগ্রসর হয় না তবে তাদের থ্রাস্টটি 0 থেকে 1 এর মধ্যে পরিবর্তিত হতে পারে এবং প্লেয়ার যখন জাহাজটি এগিয়ে যেতে চায় তখন কীভাবে যেতে হয়। অবশ্যই, কতটা ঘোরানো / চলাচল করতে হবে তার ভারসাম্য থাকা দরকার।

আমি কোনও রকেট বিজ্ঞানী নই তাই আমি আশা করছি এমন কেউ আছেন যে আমাকে বলতে পারবেন যদি প্রতিটি থ্রাস্টারের থ্রোটলটি এভাবেই গণনা করা যায় এবং আমাকে সঠিক দিকে দিকে ঠেলা দিতে পারেন।

সময় দেবার জন্য আপনাকে ধন্যবাদ! / কিম


3
আমি একই পথে শুরু করেছিলাম, তবে অনেকগুলি কনফিগারেশন দিয়ে, এটি ঘোরানো এবং অনুবাদ করা দুটোই অসম্ভব। তাহলে কি আপনি ঘোরান? না আপনি অনুবাদ অনুমতি দেয়? শেষ পর্যন্ত, এটি জাহাজটির নকশা করা ব্যবহারকারীদের উপর নির্ভর করে। জন্য আমার ডেমো এই, আমি এটা ছদ্ম। সম্পর্কিত: gamedev.stackexchange.com/questions/58216/... , gamedev.stackexchange.com/questions/40615/...
MichaelHouse

আমি অনুরূপ পথে নেমে এই পৃষ্ঠায় একটি ডেমো লিখে শেষ করেছি । আপনি যখন থ্রাস্টারগুলি চারপাশে সরিয়ে নিয়েছেন (অবস্থান ও শক্তি নির্ধারণের জন্য তাদের জাহাজে টানুন) এটি তিনটি আকার আঁকবে। অন্তর্নিহিততাটি হ'ল আপনি 3 ডি স্পেসের (x, y, ঘূর্ণন) পয়েন্ট হিসাবে সমস্ত সম্ভাব্য গতিবিধির কথা ভাবতে পারেন এবং 0-1-এ সীমাবদ্ধ থাকা সেই জায়গার একটি সীমাবদ্ধতা। সুতরাং আপনি 3 ডি আকারের সাথে সমস্ত সম্ভাব্য চলাচল সমেত শেষ করুন। যদি আপনি কোনও রৈখিক বেগ চান না তবে আপনি সেই স্থানটিতে (x = 0, y = 0) রেখার দিকে তাকিয়ে রয়েছেন (Q, W, E, S সব আমার ডেমোতে 0)
amitp

উত্তর:


7

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

প্রতিটি থ্রাস্টার জাহাজের গতিতে দুটি প্রভাব তৈরি করবে: লিনিয়ার এবং কৌণিক। এগুলি স্বতন্ত্রভাবে বিবেচনা করা যেতে পারে। যদি থ্রাস্টারটি fএকটি দিকের দিকে একটি শক্তি তৈরি করে এবং ভরর dirকেন্দ্র থেকে কোনও ভেক্টর r(জ্যামিতিক কেন্দ্র বা স্প্রাইটের কেন্দ্র নয়) দ্বারা অফসেট হয় তবে লিনিয়ার উপাদানটির উপর প্রভাবটি হয়:

t = f * dir // f is a scalar, dir is unit length

কৌণিক বেগের উপর প্রভাব টর্ক দ্বারা দেওয়া হয়:

tau = f * <dir.x, dir.y, 0> CROSS <r.x, r.y, 0> // cross product

tএকটি বল ভেক্টর (যেমন লিনিয়ার থ্রাস্ট)। tauএকটি স্বাক্ষরযুক্ত স্কেলার যা জড়তার ভর মুহুর্তের দ্বারা বিভক্ত হয়ে কৌণিক ত্বরণ দেবে। এটি গুরুত্বপূর্ণ যে dirএবং rউভয় একই স্থানাঙ্ক স্থানে, যেমন উভয় স্থানীয় স্থানাঙ্কে বা উভয় বিশ্বের স্থানাঙ্কে।

জাহাজের সামগ্রিক রৈখিক tত্বরণটি জাহাজের ভর দ্বারা বিভক্ত প্রতিটি থ্রাস্টারের জন্য যোগফল দ্বারা দেওয়া হয় । একইভাবে, কৌণিক ত্বরণ হল জড়তার ভর মুহুর্ত (যা অন্য একটি স্কেলার) দ্বারা বিভক্ত টর্কগুলির যোগফল। মোট টর্কটি শূন্য হলে জাহাজটি ফিরবে না। একইভাবে, মোট জোড় শূন্য হলে এটি সরবে না। রিকাল টর্কটি একটি স্কেলার তবে থ্রাস্ট (এর যোগফল t) একটি 2 ডি ভেক্টর।

এই প্রকাশের বিষয়টি হ'ল আমরা এখন লিনিয়ার প্রোগ্রাম হিসাবে আমাদের সমস্যাটি লিখতে পারি । বলুন প্রথম আমরা আমাদের জাহাজ করতে চান চালু ছাড়া চলন্ত । আমাদের প্রতিটি থ্রাস্টারের জন্য একটি পরিবর্তনশীল রয়েছে, $ x_1, x_2, ... $, যা থ্রাস্টার সরবরাহ করবে এমন পরিমাণ পরিমাণ। সীমাবদ্ধতার একটি সেট হ'ল:

0 <= x_i < fmax_i  //for each i

fmaxসেই থ্রাস্টারের সর্বাধিক শক্তি কোথায় (এটি আমাদের আরও শক্তিশালী বা দুর্বল করতে দেয়)। পরবর্তী, আমরা বলি যে উভয় সমতা:

0 = Sum_i  x_i * dir_i.x
0 = Sum_i  x_i * dir_i.y

এটি এই সীমাবদ্ধতাটিকে এনকোড করে যে আমরা সম্পূর্ণ রঞ্জক শূন্য (থ্রাস্টটি একটি ভেক্টর, তাই আমরা কেবল প্রতিটি অংশ শূন্য) বলি না কেন একটি লিনিয়ার ত্বরণ প্রয়োগ করব না।

এখন আমরা চাই আমাদের জাহাজটি পালা হোক। সম্ভবত আমরা যত তাড়াতাড়ি সম্ভব এটি করতে চাই, তাই আমরা এটি করতে চাই:

max (Sum_i  x_i * c_i)
where c_i = <dir_i.x, dir_i.y, 0> CROSS <r_i.x, r_i.y, 0>

x_iউপরের অসমতা এবং সমতাগুলি সন্তুষ্ট করার সময় এর জন্য সমাধান করা , যখন উপরের সারসংক্ষেপটি সর্বাধিক করে তোলা হবে, আমাদের পছন্দসই জোর দেবে। বেশিরভাগ প্রোগ্রামিং ভাষার কাছে তাদের জন্য একটি এলপি গ্রন্থাগার রয়েছে। উপরের সমস্যাটি কেবল এতে প্রবেশ করুন এবং এটি আপনার উত্তর তৈরি করবে।

একটি অনুরূপ সমস্যা আমাদের মোড় না নিয়েই চলতে দেবে। বলুন আমরা আমাদের সমস্যাটিকে একটি সমন্বিত সিস্টেমে পুনরায় লিখি যেখানে আমরা ইতিবাচক এক্স দিকে যেতে চাই। তারপরে সীমাবদ্ধতাগুলি হ'ল:

0 <= x_i < fmax_i  //for each i
max Sum_i  x_i * dir_i.x
0 = Sum_i  x_i * dir_i.y
0 = (Sum_i  x_i * c_i)
where c_i = <dir_i.x, dir_i.y, 0> CROSS <r_i.x, r_i.y, 0> // as before

বাধা যে থ্রাস্টাররা কেবল একটি একক দিকেই থ্রাস্ট তৈরি করতে পারে, সেখানে আপনি যে ধরণের আবর্তন এবং রৈখিক বেগ অর্জন করতে সক্ষম হবেন তার সীমাবদ্ধতা রয়েছে। এটি সমাধান হিসাবে উপস্থিত হবে 0 = x_1 = x_2 = ... = x_n, যার অর্থ আপনি কখনই কোথাও পাবেন না। এটি প্রশমিত করতে, আমি প্রতিটি প্লেয়ারের উভয় পাশের 45 ডিগ্রি থ্রাস্টার স্থাপনের জন্য একটি জোড়া ছোট, দুর্বল (5% বা 10% বলুন) যুক্ত করার পরামর্শ দিই। এটি সমাধানটিকে আরও নমনীয়তা দেবে, কারণ এগুলি প্রধান থ্রাস্টারগুলির দুর্বল গৌণ প্রভাবগুলির বিরুদ্ধে লড়াই করতে ব্যবহার করা যেতে পারে।

অবশেষে, প্রায় 100 টি থ্রাস্টারের মাধ্যমে, এলপির সমাধান ফ্রেম প্রতি যথেষ্ট দ্রুত করা যায়। তবে, সমাধানটি অবস্থান বা বর্তমান অবস্থার উপর নির্ভর করে না, আপনি যখনই আকৃতি পরিবর্তন করেন তখন প্রতিটি যুক্তিসঙ্গত নিয়ামক ইনপুট সংমিশ্রনের জন্য সমাধানটিকে পূর্বরূপ করতে পারেন (এর মধ্যে নন-থ্রাস্টার যুক্ত থাকে যা জড়তা বা জাহাজের ভরকে পরিবর্তন করে, কারণ তখন থ্রাস্টারগুলি ভর কেন্দ্রের সাথে তুলনামূলকভাবে আলাদা জায়গায় থাকে!)। এটি 24 সম্ভাবনা (যেমন 8 দিকের বার {বাম স্পিন, কোনও আবর্তন নেই, ডান স্পিন।)।


খুব ভালভাবে ব্যাখ্যা!
কিম

1
Sum_iএই প্রসঙ্গে অর্থ কী ?
এস তারেক Çতীন

1

আমার প্রথম চিন্তাটি একটি নিখুঁত অভিজ্ঞতামূলক সমাধান ছিল, এটি কীভাবে আচরণ করে তা কার্যকর করার জন্য বিভিন্ন ডিগ্রি স্ট্রাস্টের জন্য একটি স্যান্ডবক্স পরিবেশে অনমনীয় অনুকরণ করে। একটি নির্ণায়ক সমাধানের সন্ধানে জটিল গণিতের অনেকগুলিকে ভারসাম্য না দেওয়ার পরিবর্তে আপনি সংখ্যায় পৌঁছাতে পারেন উদাহরণস্বরূপ নিউটনের পদ্ধতি ব্যবহার করে। উদাহরণ:

থ্রাস্টের ব্যাপ্তি 0 থেকে 1000, যেখানে 1000 অনেক বেশি।

ধাপ 1

বিশ্বাসের সাথে অনুকরণ করুন (0 + 1000) / 2 = 500। ফলাফল: খুব বেশি বিশ্বাস

ধাপ ২

পরিসীমা এখন আস্থার সাথে 0 থেকে 500 সিমুলেট (0 + 500) / 2 = 250। ফলাফল: খুব বেশি বিশ্বাস

ধাপ 3

পরিসীমা এখন আস্থার সাথে 0 থেকে 250 সিমুলেটেড (0 + 250) / 2 = 125 ফলাফল: খুব অল্প বিশ্বাস

পদক্ষেপ # 4

পরিসীমা এখন আস্থার সাথে 125 থেকে 250 সিমুলেট করে (125 + 250) /2=187.5 খুব বেশি বিশ্বাসের ফলাফল

পদক্ষেপ # 5 ব্যাপ্তি এখন 125 থেকে 187.5 বিশ্বাসের সাথে অনুকরণ করুন (125 + 187.5) /2=156.25 ফলাফল খুব অল্প বিশ্বাস

পদক্ষেপ # Ran রেঞ্জ এখন 156.25 থেকে 187.5 রেঞ্জটি 35 এর নীচের নীচে যার অর্থ এটি যথেষ্ট ভাল অনুমান

চূড়ান্ত ফলাফল = (187.5 + 156.25) / 2 = 171.875

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