2012-01-29 9 views
5

यहाँ कोड के दो विभिन्न टुकड़े हैंआपरेशन के उलझन के बारे में आदेश जब XNA में एक मैट्रिक्स का उपयोग करते हुए, सी #

यह है कि मैं क्या

Vector2 hold = Vector2.Transform(pos1, mat1); 
Matrix inv = Matrix.Invert(mat2); 
Vector2 pos2 = Vector2.Transform(hold, inv); 

के साथ शुरू किया और यही मुझे बताया गया हूँ है है सरलीकृत संस्करण

Matrix matrix1to2 = mat1 * Matrix.Invert(mat2); 
Vector2 pos2 = Vector2.Transform(pos1, matrix1to2); 

क्या मुझे समझ नहीं आता है, क्यों simpilifed संस्करण में पहली पंक्ति नहीं है

Matrix matrix1to2 = Matrix.Invert(mat2)*mat1; 

मैट्रिक्स क्रम में के बाद से सही पहली और मूल हम mat1 है में प्रभावी हैं पर बात पहले

संपादित में गुणा किया जा रहा: निम्न छवि से पता चलता आपरेशन के वांछित

http://www.riemers.net/images/Tutorials/XNA/Csharp/Series2D/mat1.png

ट्यूटोरियल कहता है कि इस परिवर्तन को बनाने के लिए आप इसका उपयोग करते हैं;

Matrix carriageMat = Matrix.CreateTranslation(0, -carriage.Height, 0) * Matrix.CreateScale(playerScaling) 
* Matrix.CreateTranslation(xPos, yPos, 0) * Matrix.Identity; 

आदेश सही होने पर यह क्यों काम करता है?

+0

मुझे लगता है कि यह एक http://gamedev.stackexchange.com/ प्रश्न है। आपके पास और अधिक प्रतिक्रिया होगी। – rcdmk

+0

धन्यवाद मैं कोशिश करूँगा। क्या मुझे इसे बंद करना चाहिए? – Alxander

+0

यदि आप चाहते हैं। समस्या कुछ मॉडरेटर इस पर आएंगे। – rcdmk

उत्तर

3

के बाद से मैट्रिक्स क्रम में सही पर बात प्रभाव पहले और मूल हम mat1 है में ले जाएगा पहले

असल में गुणा किया जा रहा, "पर बात छोड़ दिया" प्रभावी होता है प्रथम। मैट्रिस उसी क्रम में वर्टेक्स पर लागू होते हैं जिसमें आप उन्हें पढ़ते हैं (माना जाता है कि आप लैटिन भाषा में उपयोग किए जाते हैं)।

एक्सएनए में, आप आमतौर पर एसआरटी (स्केल, घुमाएं, अनुवाद) क्रम में परिवर्तन करते हैं। इस तरह, ऑब्जेक्ट को स्केल किया जाएगा और दुनिया की जगह में स्थानांतरित होने से पहले अपने मूल (घूर्णन पर घूमना) के बारे में घूमता है।

उदाहरण के लिए: अगर मैं पी/2 द्वारा एक वस्तु बारी बारी से करना चाहता था, इस कदम यह 100 एक्स अक्ष के साथ इकाइयों, मैं उपयोग कर सकते हैं:

var rotate = Matrix.CreateRotationY(MathHelper.PiOver2); 
var translate = Matrix.CreateTranslation(new Vector3(100,0,0)); 

var worldMatrix = rotate * translate; 

, तो इसके बजाय, मैं वस्तु को स्थानांतरित करना चाहता था सही करने के लिए 100 यूनिट है, तो प्रभाव की परिक्रमा (बजाय के रूप में पहला उदाहरण में किया जाता है कताई) के एक प्रकार के प्राप्त करने के लिए दुनिया मूल (0,0,0) के बारे में यह घुमाने के लिए, मैं प्रयोग करेंगे

var worldMatrix = translate * rotate; 

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

var worldMatrix = rotateSpin * translate * rotateOrbit; 

जहां rotateSpin और rotateOrbit क्रमशः अपने स्पिन (वस्तु की उत्पत्ति के बारे में रोटेशन) और कक्षा को परिभाषित (दुनिया मूल अनुवाद निम्नलिखित के बारे में रोटेशन), रोटेशन मैट्रिक्स कर रहे हैं। ध्यान दें कि जिस क्रम में ऑपरेशन आपके सेवा शिखर पर प्रभाव डालता है वह बाएं से दाएं है।

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