2011-10-25 22 views
6

मैं द हज़ी माइंड द्वारा एक एक्सएनए ट्यूटोरियल का अनुसरण कर रहा हूं, मेरे पास एक मूल वस्तु है जिसमें एक स्थिति (वेक्टर 3) और एक रोटेशन (क्वाटरनियन) है। ऑब्जेक्ट मॉडल लग रहा है इस Class Diagramब्लॉक के 6 किनारे घुमाए

ट्यूटोरियल में कैमरा कार्यान्वयन से की तरह, मैं रोटेशन की एक प्रतिलिपि बना और तरीकों रिवोल्व और वस्तु पर उन्हें क्रियान्वित किया है

public virtual void Rotate(Vector3 axis, float angle) 
{ 
    axis = Vector3.Transform(axis, Matrix.CreateFromQuaternion(Rotation)); 
    Rotation = Quaternion.Normalize(Quaternion.CreateFromAxisAngle(axis, angle) * Rotation); 
} 

public virtual void Revolve(Vector3 target, Vector3 axis, float angle) 
{ 
    Vector3 revolveAxis = Vector3.Transform(axis, Matrix.CreateFromQuaternion(Rotation)); 

    Quaternion rotate = Quaternion.Normalize(Quaternion.CreateFromAxisAngle(revolveAxis, angle)); 

    Position = Vector3.Transform(Position - target, Matrix.CreateFromQuaternion(rotate)) + target; 

    Rotate(axis, angle); 
} 

मेरे ब्लॉक वस्तु 6 बनाता है Block rendered by 6 Quad objects

और अब हम वास्तविक समस्या है, मेरे ब्लॉक पर घुमाएँ बुला: क्वाड के उदाहरण और प्रत्येक क्वाड वस्तु पर विधि प्रस्तुत करना कहता है, मैं ऑफसेट और रोटेशन प्रत्येक Quad पर सौंपा एक बनावट ब्लॉक इस तरह लग रही बनाने के लिए है obj ect ऑब्जेक्ट को रोटेशन बदलने के लिए स्वयं का कारण बनता है, और मेरी क्वाड ऑब्जेक्ट घुमाती नहीं है, इस प्रकार मैंने अपने ब्लॉक ऑब्जेक्ट पर एक नया घुमावदार फ़ंक्शन लागू किया।

public override void Rotate(Vector3 axis, float angle) 
{ 
    for (int i = 0; i < mySides.Length; i++) 
    { 
     Quad side = mySides[i]; 
     side.Revolve(this.Position, axis, angle); 
    } 
} 

हालांकि मुझे उम्मीद परिणाम नहीं दिया, जैसा कि यहाँ देखी गई:

Block object rotated

गलत समाधान

निम्नलिखित समाधान काम करेंगे लेकिन बहुत सामान्य नहीं होगा और सीमित हो जाएगा: अगर बयान के बारे में जांच करता है जो अक्ष पर जांच करता है कि मैं चारों ओर घूमना चाहता हूं और फिर हर तरफ (क्वाड ऑब्जेक्ट) को सही तरीके से घुमाता है।

उचित समाधान

वैकल्पिक रूप से मैं क्वाड का प्रतिपादन ब्लॉक वस्तु (अपने माता पिता) के रोटेशन पर निर्भर वस्तुओं बना सकता है, लेकिन मैं ऐसा करने के तरीके पर अनिश्चित हूं।

तीसरा और आखिरी विकल्प यह है कि घुमाव विधि प्रत्येक क्वाड ऑब्जेक्ट्स रोटेशन और सही मानों को स्थिति अपडेट करे, यह मुझे बिल्कुल भी कैसे करना है इस बारे में अनिश्चित है।

प्रश्न

तो क्या मैं के लिए पूछ रहा हूँ इस पर कुछ विचार या विचार है, शायद कुछ लिंक और/या ट्यूटोरियल XNA में Quaternions का उपयोग कैसे करें, अधिमानतः विजुअल तरीके समझा है।

चीयर्स, आपके इनपुट :)

उत्तर

2

आप क्या करना चाहिए, और आप इस का उल्लेख करने के लिए इंतजार कर रहे, क्वाड का प्रतिपादन माता पिता के रोटेशन पर निर्भर वस्तुओं बनाते हैं।

यह आपके जैसे हाइराचल सिस्टम के साथ करना काफी आसान है। जब आपका रेंडरर ब्लॉक को प्रस्तुत करने के लिए जाता है, तो उसे ब्लॉक के रूपांतरण को मैट्रिक्स में संग्रहीत करना चाहिए, चलो इसे ब्लॉकवर्ल्ड पर कॉल करें। जब आप प्रत्येक क्वाड प्रस्तुत करने के लिए जाते हैं, तो क्वाड के स्थानीय ट्रांसफॉर्म को ब्लॉकवर्ल्ड से गुणा करें।

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