जब मैं अभिविन्यास को बदलने की कोशिश करता हूं तो मेरा कैमरा एक बिंदु के चारों ओर घूमता है। अगर मैं अपने कैमरे को घुमाता हूं, तो वाई अक्ष में 30 डिग्री, कैमरे की बजाय 30 डिग्री दाईं ओर देखता है, कैमरा उस बिंदु के चारों ओर घूमता है जिस पर वह देख रहा था।मेरा कैमरा इस गणित के साथ एक बिंदु के चारों ओर घूमता क्यों है?
o is the camera, A and B are 3D models. The lines show line-of-sight.
This is what I expect:
A B
| >/
|/
|/
|/
o
This is what actually happens:
A B
|\
| \
| \
| > \
o
अब, मेरी समझ से, क्रम में कैमरा ले जाने के लिए मुझे लगता है कि राशि का प्रतिलोम द्वारा दुनिया बढ़ना है। इसलिए यदि मैं ज़ेड अक्ष में +1 स्थानांतरित करना चाहता हूं तो मैं ज़ेड अक्ष में विश्व -1 का अनुवाद करता हूं। चूंकि मैं उन्मुखता का प्रतिनिधित्व करने के लिए quaternions का उपयोग कर रहा हूँ, मैं कैमरे quaternion के विपरीत का उपयोग करें (क्योंकि उन्मुखता हमेशा इकाई quaternions हैं, मैं उलटा गणना की बजाय conjugate का उपयोग करके अनुकूलित) सही मात्रा से दुनिया घुमाने के लिए।
यहाँ है कि कैसे मैं एक मैट्रिक्स, जहां क्ष उल्टे चार का समुदाय है करने के लिए एक चार का समुदाय कन्वर्ट:
[... ... ... -x]
|... ... ... -y|
|... ... ... -z|
[0 0 0 1]
और अंत में:
[1 - 2 * (q.y * q.y + q.z * q.z) 2 * (q.x * q.y - q.w * q.z) 2 * (q.x * q.z + q.w * q.y) 0]
|2 * (q.x * q.y + q.w * q.z) 1 - 2 * (q.x * q.x + q.z * q.z) 2 * (q.y * q.z - q.w * q.x) 0|
|2 * (q.x * q.z - q.w * q.y) 2 * (q.y * q.z + q.w * q.z) 1 - 2 * (q.x * q.x + q.y * q.y) 0|
[0 0 0 1]
उसके बाद, मैं मैट्रिक्स के अनुवाद घटक सेट मैं मॉडल-व्यू मैट्रिक्स स्टैक पर गुणा करता हूं, फिर मेरी सभी ऑब्जेक्ट्स प्रस्तुत करता हूं। मुझे पूरा यकीन है कि यह गणित सही है, लेकिन यह उन परिणामों का उत्पादन नहीं करता है जिनकी मैं अपेक्षा कर रहा था। जाहिर है कि आगे और दाएं वैक्टर समस्याएं हैं, इसलिए मेरा एकमात्र प्रश्न यह है कि वे गलत क्यों हैं और अगर मैं उन परिणामों को प्राप्त करना चाहता हूं, तो उन्हें कैसे सेट किया जाना चाहिए। धन्यवाद।
संपादित करें: मुझे this guy's quaternion camera class से समाधान मिला है। सबसे पहले मैं एक रोटेशन मैट्रिक्स का निर्माण करता हूं जैसे कि मैं पहले कर रहा था, लेकिन फिर मैं पहले, दूसरे और तीसरे कॉलम (xa, ya, और za) से मैट्रिक्स के कॉलम वैक्टर लेता हूं। तब मैं इस तरह मैट्रिक्स के अनुवादकीय घटक सेट:
[... ... ... -xa.dotProduct(cameraPos)]
|... ... ... -ya.dotProduct(cameraPos)|
|... ... ... -za.dotProduct(cameraPos)|
[... ... ... ... ]
तब परिणामस्वरूप मैट्रिक्स modelview मैट्रिक्स ढेर पर गुणा किया जा सकता है, और यह पूरी तरह से काम करता है।
अपना संपादन एक समाधान बनाएं और इसे स्वीकार करें। इस तरह हम यहां चारों ओर हल किए गए प्रश्नों को चिह्नित करते हैं। इसके अलावा मुझे लगता है कि आप कुछ स्पष्टीकरण के लायक हैं कि क्या हो रहा है। मैं इसके लिए एक जवाब लिखूंगा। – datenwolf