2009-04-18 20 views
8

मैं अपने दृश्य में gluDisk() का उपयोग कर एक फ्लैट डिस्क खींच रहा हूं। gluDisk() सकारात्मक जेड अक्ष का सामना कर डिस्क खींचता है, लेकिन मैं चाहता हूं कि यह मेरे मन में कुछ मनमाना सामान्य हो।
डिस्क को ठीक से सामना करने के लिए मुझे glRotate() का उपयोग करने की आवश्यकता है लेकिन रोटेशन क्या होना चाहिए? मुझे याद है कि इसे क्वाटरनियंस का उपयोग करके गणना की जा सकती है लेकिन मुझे गणित को याद नहीं आ रहा है।Quaternion गणित?

उत्तर

16

समाधान बहुत सरल होना चाहिए, और quarternions की आवश्यकता नहीं है।

सामान्य 1 से सामान्य 2 तक प्राप्त करने के लिए रोटेशन की धुरी दोनों को ऑर्थोगोनल होना चाहिए, इसलिए बस अपने वेक्टर क्रॉस-उत्पाद लें।

रोटेशन की मात्रा आसानी से उनके डॉट-उत्पाद से ली गई है। यह मान है | ए |। | बी | .cos (theta), लेकिन दो सामान्य वैक्टरों को सामान्यीकृत किया जाना चाहिए क्योंकि यह कोस (थेटा) देगा, इसलिए घूर्णन राशि प्राप्त करने के लिए केवल व्यस्त कोसाइन लें।

परिणामस्वरूप वेक्टर और कोण glRotate() के लिए आवश्यक पैरामीटर हैं - वास्तविक रोटेशन मैट्रिक्स की गणना करने की कोई आवश्यकता नहीं है।

पेज। यह मत भूलना कि glRotate() डिग्री में कोण की आवश्यकता है, लेकिन सामान्य सी ट्रिग रेडियंस में काम करता है।

+0

धन्यवाद। वह पूरी तरह से काम किया। – shoosh

3

Quaternions अक्ष के बारे में एक घूर्णन का वर्णन करता है। <w,x,y,z> धुरी <x,y,z> के चारों ओर घुमाएगा w की परिमाण और वेक्टर की परिमाण के बीच संतुलन के आधार पर कुछ राशि।

<cos θ/2, x*sin θ/2, y*sin θ/2, z*sin θ/2>, where |<x, y, z>| = 1 

उदाहरण के लिए, यह घूर्णन के बजाय सकारात्मक Y- अक्ष सामना करने के लिए, आप इसे एक्स अक्ष के चारों ओर 90 डिग्री बारी बारी से करने की जरूरत है। वेक्टर <0, 1, 0> होगा, और quaternion <cos 90°, 0, sin 90°, 0> = <0, 0, 1, 0> होगा।

वेक्टर <x,y,z> का सामना करने के लिए सकारात्मक Z-axis का सामना करने से आंकड़े को घुमाने के लिए आपको रोटेशन-वेक्टर और रोटेशन के कोण को खोजने की आवश्यकता है। रोटेशन अक्ष खोजने के लिए, आप वर्तमान वेक्टर का क्रॉस-उत्पाद ले सकते हैं, और जहां आप इसे चाहते हैं।

यदि यह सकारात्मक जेड-अक्ष का सामना कर रहा है, तो वर्तमान वेक्टर <0, 0, 1> होगा। यदि आप इसे <x,y,z> का सामना करना चाहते हैं, तो रोटेशन-अक्ष <0, 0, 1> x <x, y, z> = <-y, x, 0> होगी, और कोण arctan(sqrt(x^2+y^2),z) होगा। चार का समुदाय एक मनमाना धुरी के चारों ओर

<cos(θ/2), -y*sin(θ/2), x*sin(θ/2), 0>, where θ = arctan(sqrt(x^2+y^2), z) 
6

रोटेशन हो जाता है:

q0 = cos(r/2) 
q1 = sin(r/2) a 
q2 = sin(r/2) b 
q3 = sin(r/2) c 

और: यह देखते हुए रेडियंस और इकाई वेक्टर यू में कोण r = + बी.जे. + सी.के. या [क, ख, ग], को परिभाषित एअर इंडिया इन मूल्यों से निर्माण रोटेशन मैट्रिक्स:

(q0^2+q1^2 - q2^2 - q3^2 | 2*(q1*q2 - q0*q3)   | 2*(q1*q3 + q0*q2)  ) 
Q =(2*(q2*q1 + q0*q3)  | (q0^2 - q1^2 + q2^2 - q3^2) | 2*(q2*q3 - q0*q1)  ) 
    (2*(q3*q1 - q0*q2)  | 2*(q3*q2 + q0*q1)   | q0^2 - q1^2 - q2^2 + q3^2) 

रोटेशन आपको बस इतना करना ढूंढने के लिए, आप वर्तमान वेक्टर और लक्ष्य वेक्टर के बीच पार उत्पाद की गणना कर सकते हैं। आप ऑर्थोगोनल वेक्टर प्राप्त करेंगे (जो क्वाटरनियन बनाने के लिए आपका रोटेशन वेक्टर होगा) और इस वेक्टर की लंबाई उस कोण का पाप है जिसे आप क्षतिपूर्ति करना चाहते हैं ताकि प्रारंभ और लक्ष्य वेक्टर ओवरलैप हो।