2009-03-29 15 views
10

मेरे पास कैमरे के पिच और यॉ के साथ एक इनपुट 3 डी वेक्टर है। क्या कोई संसाधन का लिंक बता सकता है या प्रदान कर सकता है जो मुझे आवश्यक परिवर्तन और मैट्रिक्स मैपिंग को समझने और कार्यान्वित करने में मदद करेगा?एक विश्व निर्देशांक को कैमरा निर्देशांक में कैसे परिवर्तित करता है?

उत्तर

12

दुनिया-से-कैमरा रूपांतरण मैट्रिक्स कैमरा-टू-वर्ल्ड मैट्रिक्स के विपरीत है। कैमरा-टू-वर्ल्ड मैट्रिक्स कैमरे की स्थिति में अनुवाद का संयोजन है और कैमरे के अभिविन्यास में घूर्णन है। इस प्रकार, यदि एम 3x3 रोटेशन मैट्रिक्स कैमरे के अभिविन्यास और टी करने के लिए इसी है कैमरे की स्थिति है, तो 4x4 कैमरा करने वाली दुनिया मैट्रिक्स है:

 
M00 M01 M02 tx 
M10 M11 M12 ty 
M20 M21 M22 tz 
0 0 0 1 

नोट मुझे लगता है कि मान लिया गया है कि वेक्टर कॉलम वेक्टर होते हैं जिन्हें रूपांतरण करने के अधिकार पर गुणा किया जाता है। यदि आप विपरीत सम्मेलन का उपयोग करते हैं, तो मैट्रिक्स को स्थानांतरित करना सुनिश्चित करें।

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

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

-5

जो आप वर्णन कर रहे हैं उसे 'परिप्रेक्ष्य प्रक्षेपण' कहा जाता है और वेब पर संसाधनों का पुनर्मूल्यांकन होता है जो मैट्रिक्स गणित की व्याख्या करता है और ऐसा करने के लिए आवश्यक कोड देता है। आप wikipedia page

7

साथ शुरू कर सकता है हम एक 4x4 मैट्रिक्स का वर्णन करने के लिए इस तरह एक संरचना है:

class Matrix4x4 
{ 
public: 
    union 
    { 
     struct 
     { 
      Type Xx, Xy, Xz, Xw; 
      Type Yx, Yy, Yz, Yw; 
      Type Zx, Zy, Zz, Zw; 
      Type Wx, Wy, Wz, Ww; 
     }; 

     struct 
     { 
      Vector3<Type> Right; 
      Type XW; 
      Vector3<Type> Up; 
      Type YW; 
      Vector3<Type> Look; 
      Type ZW; 
      Vector3<Type> Pos; 
      Type WW; 
     }; 

     Type asDoubleArray[4][4]; 
     Type asArray[16]; 
    }; 
}; 

यदि आप केवल इतना है यूलर कोण है, कि एक कोण विचलन, पिच, और रोल का प्रतिनिधित्व करता है और स्थिति के लिए 3 डी स्पेस में एक बिंदु, आप दाएं, ऊपर, और देखो वैक्टर की गणना कर सकते हैं। ध्यान दें कि दाएं, ऊपर, और देखो केवल एक्स, वाई, जेड वेक्टर हैं, लेकिन चूंकि यह एक कैमरा है, इसलिए मुझे इसे नाम देना आसान लगता है। कैमरा मैट्रिक्स में अपनी roations को लागू करने का सबसे आसान तरीका रोटेशन मैट्रिक्स की एक श्रृंखला बनाना और प्रत्येक रोटेशन मैट्रिक्स द्वारा हमारे कैमरा मैट्रिक्स को गुणा करना है।

कि के लिए एक अच्छा संदर्भ यहाँ है: http://www.euclideanspace.com

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

आखिरकार, आप कैमरे के परिवर्तन को लागू करने से पहले, आपको कैमरे के मैट्रिक्स के विपरीत होने की आवश्यकता है। बहुभुज ड्राइंग शुरू करने से पहले आप अपने मॉडलव्यू मैट्रिक्स को गुणा करने जा रहे हैं। ऊपर मैट्रिक्स वर्ग के लिए, उलटा इस तरह की जाती है: हमारे सभी मैट्रिक्स constuction साथ रास्ते से बाहर

template <typename Type> 
Matrix4x4<Type> Matrix4x4<Type>::OrthoNormalInverse(void) 
{ 
    Matrix4x4<Type> OrthInv; 
    OrthInv = Transpose(); 
    OrthInv.Xw = 0; 
    OrthInv.Yw = 0; 
    OrthInv.Zw = 0; 
    OrthInv.Wx = -(Right*Pos); 
    OrthInv.Wy = -(Up*Pos); 
    OrthInv.Wz = -(Look*Pos); 
    return OrthInv; 
} 

तो अंत में, आप कुछ इस तरह कर रहे होते:

Matrix4x4<float> cameraMatrix, rollRotation, pitchRotation, yawRotation; 
Vector4<float> cameraPosition; 

cameraMatrix = cameraMatrix * rollRotation * pitchRotation * yawRotation; 

Matrix4x4<float> invCameraMat; 

invCameraMat = cameraMatrix.OrthoNormalInverse(); 

glMultMatrixf(invCameraMat.asArray); 

आशा इस मदद करता है.

संबंधित मुद्दे

 संबंधित मुद्दे