स्पेस शिप का डायनेमिक थ्रस्टर बैलेंसिंग


14

मेरे खेल में अंतरिक्ष जहाज किसी भी रोटेशन के साथ कहीं भी संलग्न थ्रस्टरों की एक मनमानी राशि के साथ खिलाड़ी-निर्मित होने के लिए थे। वर्तमान में मेरे पास जहाज को घुमाने के लिए कुछ गंदे कोड हैं (त्वरित और विघटित)।

यहां एक सममित जहाज का उदाहरण दिया गया है, जहां लाल रेखा इंगित करती है, जिसे बाएं घूमने के लिए कहा जाता है।

समुंद्री जहाज

हालाँकि, जैसा कि आप कल्पना करेंगे कि खिलाड़ी ने कहाँ-कहाँ पर रोमांच डाला है, इस पर निर्भर करता है कि कभी-कभी अवांछित रैखिक बल जहाज को प्रभावित कर रहे हैं। इस मामले में, जहाज आगे बढ़ना शुरू कर देता है।

मैं इस बारे में विस्तार से बता रहा हूं कि क्या यह संभव है कि अधिकतम थ्रस्ट एक थ्रस्टर पा सके, जिससे कोई रेखीय वेग उत्पन्न न हो सके। (उपरोक्त मामले में कोई भी नहीं होगा क्योंकि पीछे के थ्रस्टरों से बलों का मुकाबला करने के लिए कुछ भी नहीं है, और सामने वाले प्रत्येक को मार डालते हैं)।

अब तक जो भी मैं साथ आया हूं, वह "टर्न एफिशिएंसी" को निर्धारित करने का एक फार्मूला है। उदाहरण के लिए, लीनियर मूवमेंट के संबंध में कितना रोटेशन होता है।

ए - स्थिति वेक्टर थ्रस्टर बी के लिए - स्थिति वेक्टर थ्रस्टर बी v1 - थ्रस्टर से बल v2 - थ्रस्टर बी से बल

कार्यकुशलता = a.cross (v1) / | v1 | - (a .ross (v1) + b.cross (v2)) / | v1 + v2 |

, मूल रूप से "a .ross (v1 * t) / | v1 |" बारी दक्षता माना जाता है। और फिर हम इसे संयुक्त थ्रस्टर्स की बारी दक्षता से घटाते हैं, यह देखने के लिए कि क्या नई थ्रस्ट फायरिंग इसके लायक है।

समस्या तब पैदा होती है जब मुझे पता चलता है कि थ्रस्टर्स को चालू / बंद नहीं किया जाता है, लेकिन उनके जोर को 0 से 1 तक अलग-अलग किया जा सकता है। निश्चित रूप से, इस बात का संतुलन बनाने की आवश्यकता होगी कि कितना घूमना / घूमना है।

मैं कोई रॉकेट वैज्ञानिक नहीं हूं, इसलिए मैं उम्मीद कर रहा हूं कि कोई ऐसा व्यक्ति है जो मुझे बता सकता है कि क्या इस तरह से प्रत्येक थ्रस्टर की गला घोंटना गणना करना संभव है और मुझे सही दिशा में धक्का दे सकता है।

समय निकालने के लिए आपका धन्यवाद! / किम


3
मैंने एक ही रास्ते पर शुरुआत की, लेकिन कई विन्यासों के साथ, दोनों को घुमाना और अनुवाद करना असंभव है। तो क्या आप चक्कर काट लेते हैं? या आप अनुवाद की अनुमति देते हैं? अंत में, यह जहाज को डिजाइन करने वाले उपयोगकर्ता पर निर्भर है। इसके डेमो के लिए, मैंने इसे फेक कर दिया। संबंधित: gamedev.stackexchange.com/questions/58216/... , gamedev.stackexchange.com/questions/40615/...
MichaelHouse

मैं इसी तरह से नीचे गया और इस पृष्ठ पर एक डेमो लिखना समाप्त कर दिया । जैसे ही आप थ्रस्टर्स को चारों ओर ले जाते हैं (स्थिति और शक्ति निर्धारित करने के लिए उन्हें जहाज पर खींचें) यह तीन आकृतियों को खींचता है। अंतर्ज्ञान यह है कि आप 3 डी अंतरिक्ष (एक्स, वाई, रोटेशन) में एक बिंदु के रूप में सभी संभावित आंदोलनों के बारे में सोच सकते हैं, और 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की, इसके बाद के संस्करण असमानताओं और समानताओं को संतोषजनक जबकि जबकि ऊपर योग को अधिकतम, हमें वांछित जोर दे देंगे। अधिकांश प्रोग्रामिंग भाषाओं में उनके लिए एलपी लाइब्रेरी उपलब्ध है। बस उपरोक्त समस्या को इसमें डालें और यह आपके उत्तर का उत्पादन करेगा।

इसी तरह की समस्या हमें बिना रुके आगे बढ़ने देगी। कहें कि हम अपनी समस्या को एक समन्वय प्रणाली में फिर से लिखते हैं जिसमें हम सकारात्मक x दिशा में बढ़ना चाहते हैं। फिर अड़चनें हैं:

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, जिसका अर्थ है कि आप कभी भी कहीं भी नहीं मिलेगा। इसे कम करने के लिए, मैं सुझाव देता हूं कि प्रत्येक खिलाड़ी के लिए छोटे, कमजोर (5%, या 10%) के जोड़े को जोड़कर दोनों तरफ 45 डिग्री पर थ्रस्टर रखा जाए। यह समाधान को अधिक लचीलापन देगा, क्योंकि इनका उपयोग मुख्य थ्रस्टर्स के कमजोर माध्यमिक प्रभावों का मुकाबला करने के लिए किया जा सकता है।

अंत में, शायद 100 थ्रस्टर्स के माध्यम से, एलपी का समाधान प्रति फ्रेम करने के लिए पर्याप्त तेज़ है। हालाँकि, क्योंकि समाधान स्थान या वर्तमान स्थिति पर निर्भर नहीं करता है, आप प्रत्येक उचित नियंत्रक इनपुट संयोजन के लिए समाधान को पूर्ववर्ती कर सकते हैं जब भी आकार बदलता है (इसमें गैर-थ्रस्टर्स को जोड़ना शामिल है जो जड़ता या जहाज के द्रव्यमान को बदल देता है, क्योंकि तब थ्रस्टर्स द्रव्यमान के केंद्र के सापेक्ष एक अलग स्थान पर होते हैं!)। यह 24 संभावनाएं हैं (यानी 8 दिशाओं का समय {बाएं स्पिन, कोई रोटेशन नहीं, दाएं स्पिन})।


बहुत अच्छी तरह से समझाया!
किम

1
Sum_iइस संदर्भ में क्या मतलब है?
एस। तारिक inetin

1

मेरा पहला विचार एक विशुद्ध रूप से अनुभवजन्य समाधान था, जो एक सैंडबॉक्स वातावरण में रिग का अनुकरण करने के लिए जोर के अलग-अलग डिग्री के लिए काम करता है कि यह कैसे व्यवहार करता है। एक निर्धारक समाधान की तलाश में बहुत सारे जटिल गणित को संतुलित करने के बजाय आप न्यूटन की विधि का उपयोग करके उदाहरण के लिए संख्यात्मक रूप से उस तक पहुंच सकते हैं। उदाहरण:

जोर की सीमा 0 से 1000 है जहां 1000 ALOT है।

चरण 1

विश्वास के साथ अनुकरण (0 + 1000) / 2 = 500। परिणाम: बहुत अधिक भरोसा

चरण 2

रेंज अब ट्रस्ट के साथ 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 परिणाम बहुत कम विश्वास है

चरण # 6 रेंज अब 156.25 से 187.5 है रेंज 35 की सीमा से नीचे है जिसका अर्थ है कि यह एक अच्छा पर्याप्त अनुमान है

अंतिम परिणाम = (187.5 + 156.25) / 2 = 171.875

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.