जड़ता सेंसर की गणना


10

एक जटिल और लंबा सवाल है कि, मैं मानता हूँ, मैं अभी तक बहुत अच्छी तरह से समझ नहीं है तो मैं कोशिश करूँगा और सबसे अच्छा के रूप में मैं कर सकता हूँ समझा सकता हूँ।

लघु संस्करण: क्या कोई सामान्य सी ++ / फिजिक्स फॉर्मूला है जो किसी वस्तु के आकार के आधार पर जड़ता के दसियों की गणना करता है?

लंबा संस्करण: हमारी भौतिकी के लिए, हमें x, y और z जड़ता द्योतक को निर्दिष्ट करने की आवश्यकता है। वर्तमान में जिस तरह से हम यह कर रहे हैं वह बहुत बड़े पैमाने पर आधारित अनुपात है। इसलिए यदि कोई वस्तु X अक्ष पर लंबी और Y और Z पर पतली है, और द्रव्यमान 10000 है, तो हम Z और Y को 7000 और X से 3000 पर सेट करेंगे। (यह सटीक नहीं है, लेकिन सिर्फ एक विचार देने के लिए)

यह अपेक्षाकृत अच्छी तरह से काम करता है, लेकिन हमारी सबसे बड़ी समस्या यह है कि जब कहीं संयुक्त अस्थिरता होती है, तो हमें टेनर्स पर अनुमान लगाना पड़ता है जब तक कि हम सबसे अच्छा काम नहीं करते। यह बहुत समय लेने वाला बन सकता है यदि हमारे पास एक बहुत बड़ा भौतिकी सिमुलेशन है और 20+ जोड़ों में से एक अन्य सभी को स्थिरता खोने का कारण बन रहा है।

मैं जिस पर काम कर रहा हूं वह एक ऐसा फ़ंक्शन है जो किसी ऑब्जेक्ट की बाउंडिंग बॉक्स ले जाएगा और उम्मीद है कि अपेक्षाकृत सटीक टेंसरों की गणना करेगा। मैंने http://en.wikipedia.org/wiki/List_of_moment_of_inertia_tensors से कुछ गणित निकाले हैं और एक फ़ंक्शन बनाया है जो मूल रूप से नीचे दिए गए समान घुमावों के लिए निम्नलिखित की तरह काम करता है।

चौड़ाई w का ठोस घनाभ, ऊँचाई h, गहराई d और द्रव्यमान m यहाँ छवि विवरण दर्ज करें

या यदि रोटेशन समाप्ति पर है, तो इस तरह:

यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें

तो, यह मुझे ऐसे परिणाम देता है जो हमारे द्वारा किए जा रहे तरीके के समान हैं, लेकिन मैं यह सुनिश्चित करने के बिना इस तरह से स्विच नहीं करना चाहता कि यह सामान्य उपयोग के लिए काम करेगा। नीचे एक घन और केंद्र धुरी के साथ पहली छवि के आधार पर मेरे कार्य के लिए कोड है।

NxVec3 CalculateInertiaTensor( VisBoundingBox_cl boundingBox, float m )
{
    float width = boundingBox.GetSizeX();
    float height = boundingBox.GetSizeZ();
    float depth = boundingBox.GetSizeY();

    float xTensor = 0.083f * m*(height*height + depth*depth);
    float yTensor = 0.083f * m*(width*width + depth*depth);
    float zTensor = 0.083f * m*(width*width + height*height);

    return NxVec3(xTensor, yTensor, zTensor);
}

मैं यह गारंटी नहीं दे सकता कि यह ऐसा करने का सही तरीका है (जैसा कि सबसे सटीक तरीका एक बाउंडिंग बॉक्स के बजाय वास्तविक आकार का उपयोग करना है) और मैं जड़ता के दसियों और गणित से बहुत परिचित नहीं हूं लेकिन यह संख्याओं को वापस करता है। हम जो प्रयोग कर रहे थे, उसके समान। यहां किसी को भी यह जानने के लिए होता है कि क्या ऐसा करने का एक बेहतर तरीका है?


3
यदि आप टेट्राहेड्रा में अपनी वस्तु को विघटित कर सकते हैं, तो आपको एक टेट्राहेड्रॉन की जड़ता के क्षण के लिए मूल सूत्र के साथ-साथ टेंसर की रैखिकता का उपयोग करने में सक्षम होना चाहिए (उदाहरण के लिए, आप वुल्फ अल्फा के साथ इसे पा सकते हैं) टेन्सर। बाउंडिंग बॉक्स विधि के साथ मेरी चिंता यह होगी कि यह वास्तव में इस बात पर निर्भर करता है कि आपकी बीबी कितनी मात्रा में भरती है; उदाहरण के लिए, एक वसा दीर्घवृत्ताकार और एक पतले पेचदार वसंत के बीच अंतर की कल्पना करें।
स्टीवन स्टडनिक

इनपुट के लिए धन्यवाद। और आप सही हैं, मेरा मुख्य मुद्दा तब आता है जब कहते हैं, 'ए' आकार की वस्तु, बीबी टेंसर्स को गलत तरीके से वापस लाएगी। मैं आपकी जानकारी की जाँच करूँगा, धन्यवाद!
मुंगोइड

आपका स्वागत है - यदि आप मुझे इसके बारे में अधिक विस्तार से बताना चाहते हैं, तो मुझे इसका उचित उत्तर देने में सक्षम होना चाहिए, लेकिन यह आपको शुरू करने के लिए पर्याप्त होना चाहिए।
स्टीवन स्टडनिक

यदि आप करने के लिए तैयार हो जाएगा, यह भयानक होगा! मैं थोड़ी देर के लिए यह पता लगाने की कोशिश कर रहा था, लेकिन मैं अभी भी इस क्षेत्र में थोड़ा भाग रहा हूं, इसलिए मैं अपने आप को अधिक से अधिक भ्रमित कर रहा हूं = -)
मुंगोइड

जवाबों:


7

मैं यह सुझाव देने जा रहा था कि यह एक कठिन समस्या है क्योंकि वॉल्यूम इंटीग्रल को सतह इंटीग्रल में बदलने के लिए ग्रीन के प्रमेय का उपयोग करने पर आधारित सामान्य फॉर्मूले लागू नहीं होते हैं, और इसलिए आपको वास्तव में आपके चित्र का टेट्राहेड्रल अपघटन प्रदान करना होगा - यह बदल जाता है यह सही नहीं है। जब तक आपका आकार एक समान घनत्व का होता है (जो कि एक अनुमान है कि आप पहले से ही वैसे भी बना रहे हैं, संभवतः, और अधिकांश परिस्थितियों के लिए एक पूरी तरह से उचित है) तो वॉल्यूम इंटीग्रल को सतह इंटीग्रल से सरलीकृत किया जा सकता है, और बाद में इसे और भी सरल बनाया गया है। बेहतर अभी तक, ऐसा करने के लिए नेट पर एक बहुत अच्छा दिखने वाला एल्गोरिदम और कोड बाहर दिखाई देता है; अच्छी तरह से देखिएhttp://www.cs.berkeley.edu/~jfc/mirtich/massProps.html, ब्रायन मिर्टिच का पृष्ठ, पल और द्रव्यमान के केंद्र की गणना के लिए उनके एल्गोरिदम का वर्णन करता है। इस मोर्चे पर आपकी सभी जरूरतों को पूरा करना चाहिए। ध्यान दें कि यह कुछ ऐसा है जिसे आप एक बार करना चाहते हैं, या तो आकार के निर्यात पर या आयात समय पर एक उपकरण के रूप में, लेकिन कुछ ऐसा नहीं है जिसे आपको हर फ्रेम करने की आवश्यकता होगी; बस आकार की जानकारी के बाकी हिस्सों के साथ द्रव्यमान के केंद्र के बारे में जड़ता टेंसर को स्टोर करें, और यदि आपको कभी किसी अन्य अक्ष के बारे में जड़ता के क्षणों के लिए टेंसर को खोजने की आवश्यकता है तो आप इसे प्राप्त करने के लिए मानक प्रमेय का उपयोग कर सकते हैं।

उम्मीद है कि यह आपको जो चाहिए वह कवर करना चाहिए - अगर वहाँ अधिक है कि मैं इसके साथ मदद करने की कोशिश कर सकता हूं, तो मुझे बताएं!


4

मैंने खुद ऐसा कभी नहीं किया है, लेकिन अगर मुझे मनमाने ढंग से मेष के लिए एक त्वरित समाधान लिखना पड़ा, तो मैं इसे अनुमानित करने के लिए वस्तु के अंदर पर्याप्त द्रव्यमान अंक उत्पन्न करूंगा और उन लोगों से जड़ता के दसियों की गणना करूंगा।

आकार के बाउंडिंग बॉक्स के अंदर समान रूप से अंक उत्पन्न किए जा सकते हैं और फिर वास्तविक आकार से बाहर रहने वालों को छोड़ सकते हैं। यह समस्या को जांचने के लिए कम करेगा यदि कोई बिंदु किसी आकृति के अंदर है।


0

अधिकांश खेल अनुप्रयोगों के लिए (यानी "सामान उड़ाने") ऊपर दिए गए एक आयताकार ठोस के लिए समीकरण का उपयोग करना संभवतः काफी अच्छा है। बशर्ते कि वस्तु अक्ष-संरेखित हो, न कि बाउंडिंग बॉक्स में एक विकर्ण, जो काम करे। कुछ खेल भौतिकी इंजन, जैसे कि ओडीई, केवल जड़ता टेंसर के मुख्य विकर्ण पर शर्तों का उपयोग करते हैं। उनके लिए, आपकी वस्तुओं को सही काम करने के लिए कम से कम मोटे तौर पर अक्ष-संरेखित होना चाहिए।

मैंने 1997 में फ़ॉलिंग बॉडीज़ में मिरिच के अल्गोरिदम का इस्तेमाल किया। यह अच्छी तरह से काम करता है, लेकिन आपके पास क्लीन ज्योमेट्री होनी चाहिए - एक स्थैतिक रूप से सही बंद नॉन-सेल्फ-इंटरसेक्टिंग मेश। यदि छेद हैं, तो जड़ता अभिकलन पूरी तरह से फर्जी परिणाम देगा। मैंने केवल उत्तल ज्यामिति का उपयोग किया, इसलिए मैंने टक्कर के उद्देश्यों के लिए उत्तल पतवार प्राप्त करने के लिए पहले QHull को चलाया, फिर उसी से जड़ता की गणना की।

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