कैसे देखें मैट्रिक्स से अनुवाद


11

मैं अपने दृश्य मैट्रिक्स से कैमरे की विश्व-स्थान स्थिति कैसे प्राप्त कर सकता हूं? इस प्रश्न का एकमात्र उत्तर मैंने देखा कि अनुवाद अंतिम पंक्ति / कॉल में है, लेकिन यह काम नहीं करेगा क्योंकि मैट्रिक्स में [x (डॉट) राइट, y (डॉट) अप, z (डॉट) लुक] है

जवाबों:


10

संक्षिप्त जवाब

पहले दृश्य मैट्रिक्स को उल्टा करें। फिर अंतिम पंक्ति / कॉलम से अनुवाद प्राप्त करें।

लंबा जवाब

दृश्य मैट्रिक्स की सामग्री को घटाने का एक तरीका यह है कि कैमरे को दुनिया की किसी भी अन्य वस्तु के रूप में देखकर शुरू किया जाए, और इसके लिए एक विश्व मैट्रिक्स की गणना की जाए:

RightX  RightY  RightZ  0
UpX     UpY     UpZ     0
LookX   LookY   LookZ   0
PosX    PosY    PosZ    1

एक विश्व मैट्रिक्स स्थानीय अंतरिक्ष से विश्व अंतरिक्ष के लिए निर्देशांक को रूपांतरित करता है। लेकिन इस मामले में, कैमरे का स्थानीय स्थान और दृश्य स्थान एक समान है, इसलिए हम यह भी कह सकते हैं कि यह मैट्रिक्स दृश्य अंतरिक्ष से विश्व स्थान तक समन्वय को बदल देता है।

चूंकि हमें विपरीत दिशा में रूपांतरण की आवश्यकता होती है, इसलिए हमें मैट्रिक्स को पलटना होगा। परिणाम वह है जिसे हम व्यू मैट्रिक्स कहते हैं, जो विश्व अंतरिक्ष से निर्देशांक को अंतरिक्ष को देखने के लिए परिवर्तित करता है:

   RightX        UpX        LookX      0
   RightY        UpY        LookY      0
   RightZ        UpZ        LookZ      0
-(Pos*Right)  -(Pos*Up)  -(Pos*Look)  1      // * = dot product

और आपके पास मैट्रिक्स का प्रकार है। इसलिए कैमरे की स्थिति को वापस लाने के लिए, आपको पहले इसे उल्टा करने की आवश्यकता होगी, और फिर आप अंतिम पंक्ति (या सिस्टम के आधार पर कॉलम) से अनुवाद को पकड़ सकते हैं।


1
मैट्रिक्स को पहले उल्टा क्यों करें? यदि आप (उम्मीद से) जानते हैं कि यदि आप पंक्ति-प्रमुख या स्तंभ-प्रमुख हैं, तो अनुवाद वेक्टर का स्थान स्पष्ट होना चाहिए।
डी डेव

7

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

[x (dot) right, y (dot) up, z (dot) look]वास्तविक दृश्य मैट्रिक्स नहीं है। मैट्रिक्स स्वयं फॉर्म का है:

1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1

जहाँ ऊपर बायीं ओर 3x3 मैट्रिक्स घूमने, स्केल आदि का प्रतिनिधित्व करता है, वहाँ सभी कैमरा का ओरिएंटेशन किया जाता है। शेष पंक्ति और स्तंभ का उपयोग अनुवाद के लिए किया जाता है और कुछ अन्य जटिल परिप्रेक्ष्य सामान जो मैं अभी प्राप्त नहीं करने जा रहा हूं।

जब आप मैट्रिक्स प्राप्त करते हैं (यह एक 4x4 मैट्रिक्स है), तो अनुवाद हमेशा अंतिम पंक्ति या अंतिम कॉलम में संग्रहीत किया जाएगा, यह इस बात पर निर्भर करता है कि आपका मैट्रिक्स वर्ग पंक्ति-प्रमुख है या स्तंभ-प्रमुख क्रम।

आप जिस चीज के बारे में भ्रमित हो रहे हैं वह यह तथ्य है कि आपको डॉट उत्पादों की आवश्यकता है। क्या चल रहा है मैट्रिक्स गणित का सरलीकरण, इस स्टैक ओवरफ्लो प्रश्न में अधिक विस्तृत उत्तर हैं: /programming/349050/calculating-a-lookat-matrix

समाधान यहां पाया जा सकता है , आपको मैट्रिक्स का व्युत्क्रम लेने और उस का अनुवाद प्राप्त करने की आवश्यकता है:

Vector3 ViewTrans = Matrix.Invert(ViewMatrix).Translation;
Position = ViewTrans;

5

यहां अन्य उत्तर बताते हैं कि कैमरा मैट्रिक्स व्युत्क्रम से कैमरा स्थिति कैसे प्राप्त करें।

यदि कैमरा मैट्रिक्स के 3x3 भाग में केवल रोटेशन होता है (कोई स्केलिंग या बाल काटना नहीं) जैसा कि वे आमतौर पर करते हैं, तो कैमरा मैट्रिक्स ट्रांसलेशन के साथ कैमरा मैट्रिक्स अनुवाद को गुणा करके गणना को अनुकूलित किया जा सकता है। कैमरा की स्थिति तब रूपांतरित ट्रांसलेट वेक्टर -1 से गुणा होती है। GLSL में यह है:

vec3 cameraPosition = -transpose(mat3(worldToCameraMatrix)) * worldToCameraMatrix[3].xyz;

या

vec3 cameraPosition = -worldToCameraMatrix[3].xyz * mat3(worldToCameraMatrix);

अगर मैं एक समान के रूप में कैमरे की स्थिति की गणना और पास नहीं करना चाहता हूं तो यह मैं अपने शीर्ष शेड्स में उपयोग कर रहा हूं।

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