2008-09-20 13 views
13

मेरे पास एक 3 डी ऑब्जेक्ट है जिसे मैं 3 डी में घूमने में सक्षम होना चाहता हूं। सबसे आसान तरीका एक्स और वाई माउस गति को वाई और एक्स अक्ष के बारे में घूर्णन के लिए सीधे अनुवाद करना है, लेकिन यदि दोनों अक्षों के साथ कुछ घूर्णन होता है, तो जिस तरह से मॉडल घूमता है, वह अत्यधिक counterintuitive बन जाता है (यानी यदि आप ऑब्जेक्ट 180 डिग्री एक के बारे में फ़्लिप करते हैं धुरी, अन्य धुरी के साथ आपकी गति उलट है)।किसी ऑब्जेक्ट के 3 डी रोटेशन में माउस ड्रैग गति का अनुवाद करने का सबसे अच्छा तरीका

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

उत्तर

4

एक संचयक मैट्रिक्स बनाएं और इसे पहचान के साथ प्रारंभ करें।

प्रत्येक फ्रेम, वस्तु को चित्रित करने से पहले अपने मॉडलव्यू/विश्व मैट्रिक्स स्थिति पर लागू करें।

माउस गति पर, एक्स अक्ष के बारे में कुछ संवेदनशीलता_कॉन्स्टेंट * delta_x के साथ एक रोटेशन मैट्रिक्स का निर्माण करें। अन्य घटक के लिए वाई अक्ष के बारे में एक और रोटेशन मैट्रिक्स का निर्माण करें। एक गुणा करें, फिर दूसरा संचयक पर।

जब आप माउस को ले जाते हैं तो संचयक बदल जाएगा। ड्राइंग करते समय, यह ऑब्जेक्ट को उन्मुख करेगा जैसा आप उम्मीद करते हैं।

इसके अलावा, quaternions के बारे में बात करने वाला व्यक्ति सही है; यह केवल छोटे वृद्धिशील परिवर्तनों के लिए अच्छा लगेगा। यदि आप इसे एक विकर्ण पर जल्दी खींचते हैं, तो यह आपके द्वारा अपेक्षित तरीके से घुमाएगा नहीं।

+0

मैं चल बिन्दु अस्पष्टता के प्रभाव overestimated। बस घूर्णन जमा करना ठीक काम करता है। मैं quaternions में देखता हूँ, लेकिन चूंकि मैं केवल 2 axes घूर्णन कर रहा हूँ, सबकुछ ठीक लग रहा है। –

3

आप अपने रोटेशन मैट्रिक्स को रेनॉर्मलाइज करके परिशुद्धता के नुकसान से निपट सकते हैं ताकि प्रत्येक पंक्ति में से प्रत्येक पंक्ति लंबवत हो। या आप ऑब्जेक्ट के बारे में मौजूदा जानकारी के आधार पर संशोधित करने वाले रोटेशन मैट्रिक्स को पुन: उत्पन्न कर सकते हैं, और यह पुनर्निर्मितीकरण की आवश्यकता को दूर करता है।

वैकल्पिक रूप से आप quaternions का उपयोग कर सकते हैं, जो घूर्णन से निपटने के लिए यूलर कोणों का एक विकल्प है।

मैंने this faq से अपने शुरुआती दिनों में यह बहुत सी सीखा, जो इस समस्या से संबंधित है (हालांकि किसी अन्य एप्लिकेशन के लिए) Euler's are Evil में।

6

संभवतः अक्ष के लंबवत ऑब्जेक्ट को वर्तमान ड्रैग दिशा में घूमने के लिए सबसे सहज है, या तो प्रत्येक माउस गति के साथ वृद्धिशील, या ड्रैग स्टार्ट स्थिति के सापेक्ष। दो विकल्प थोड़ा अलग उपयोगकर्ता इंटरैक्शन देते हैं, जिनमें से प्रत्येक के पास उनके प्लस और माइनस होते हैं।

एक कोण को बदलने के लिए relatively straightforward तरीका है और एक 3 डी वेक्टर घुमावदार अक्ष का प्रतिनिधित्व करता है जो घूर्णन मैट्रिक्स में घुमाया जाता है।

आप सही हैं कि वृद्धिशील घूर्णन के माध्यम से कच्चे रोटेशन मैट्रिक्स को अपडेट करने के परिणामस्वरूप मैट्रिक्स अब शुद्ध रोटेशन मैट्रिक्स नहीं होगा। ऐसा इसलिए है क्योंकि एक 3x3 रोटेशन मैट्रिक्स में घूर्णन का प्रतिनिधित्व करने के लिए आवश्यकतानुसार तीन गुना अधिक डेटा होता है।

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

यूलर कोण अवधारणात्मक रूप से अच्छे हैं, हालांकि यह पीछे और आगे रूपांतरण करने के लिए बहुत काम है।

एक और व्यावहारिक विकल्प Quaternions (also) है, जो चार तत्व वैक्टर हैं। चार तत्व रोटेशन और वर्दी स्केल निर्दिष्ट करते हैं, और ऐसा होता है कि यदि आप वेक्टर में इकाई लंबाई में सामान्य और सामान्य होते हैं, तो आपको 1.0 का स्केल कारक मिल जाएगा। ऐसा लगता है कि एक कोण अक्ष मूल्य भी द्वारा

q.x = sin(0.5*angle) * axis.x; 
q.y = sin(0.5*angle) * axis.y; 
q.z = sin(0.5*angle) * axis.z; 
q.w = cos(0.5*angle); 

बहुत आसानी से एक चौका मूल्य में बदला जा सकता फिर आप चौका उत्पाद ले जा सकते हैं वर्तमान रोटेशन चौका और वृद्धिशील की (जो केवल साधारण गुणा और इसके उपयोग करता है) घूर्णन quaternion एक नया quaternion पाने के लिए जो दोनों घूर्णन प्रदर्शन का प्रतिनिधित्व करता है। उस बिंदु पर आप शुद्ध रोटेशन सुनिश्चित करने के लिए लंबाई को सामान्य कर सकते हैं, लेकिन अन्यथा घुमावदार संयोजन को लगातार जारी रखें।

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

5

मेरे कंप्यूटर ग्राफिक्स पाठ्यक्रम में, हमें निम्नलिखित कोड दिया गया था जिसने हमें पहिया को फिर से शुरू करने की अनुमति नहीं दी।

trackball.h

trackball.c