जवाबों:
संक्षिप्त जवाब
पहले दृश्य मैट्रिक्स को उल्टा करें। फिर अंतिम पंक्ति / कॉलम से अनुवाद प्राप्त करें।
लंबा जवाब
दृश्य मैट्रिक्स की सामग्री को घटाने का एक तरीका यह है कि कैमरे को दुनिया की किसी भी अन्य वस्तु के रूप में देखकर शुरू किया जाए, और इसके लिए एक विश्व मैट्रिक्स की गणना की जाए:
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
और आपके पास मैट्रिक्स का प्रकार है। इसलिए कैमरे की स्थिति को वापस लाने के लिए, आपको पहले इसे उल्टा करने की आवश्यकता होगी, और फिर आप अंतिम पंक्ति (या सिस्टम के आधार पर कॉलम) से अनुवाद को पकड़ सकते हैं।
सबसे पहले मैं अत्यधिक केवल एक वेक्टर के रूप में स्थिति को अलग से रखने की सलाह दूंगा, यह चीजों को कम्प्यूटेशनल रूप से बहुत आसान बना देगा। वैसे भी ...
[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;
यहां अन्य उत्तर बताते हैं कि कैमरा मैट्रिक्स व्युत्क्रम से कैमरा स्थिति कैसे प्राप्त करें।
यदि कैमरा मैट्रिक्स के 3x3 भाग में केवल रोटेशन होता है (कोई स्केलिंग या बाल काटना नहीं) जैसा कि वे आमतौर पर करते हैं, तो कैमरा मैट्रिक्स ट्रांसलेशन के साथ कैमरा मैट्रिक्स अनुवाद को गुणा करके गणना को अनुकूलित किया जा सकता है। कैमरा की स्थिति तब रूपांतरित ट्रांसलेट वेक्टर -1 से गुणा होती है। GLSL में यह है:
vec3 cameraPosition = -transpose(mat3(worldToCameraMatrix)) * worldToCameraMatrix[3].xyz;
या
vec3 cameraPosition = -worldToCameraMatrix[3].xyz * mat3(worldToCameraMatrix);
अगर मैं एक समान के रूप में कैमरे की स्थिति की गणना और पास नहीं करना चाहता हूं तो यह मैं अपने शीर्ष शेड्स में उपयोग कर रहा हूं।