سؤال

أنا أرسم قرص مسطح باستخدام gluDisk() في مشهد بلدي. gluDisk() يرسم القرص الذي يواجه محور z الإيجابي ولكن أريد أن تواجه بعض المعتاد التعسفي لدي.
بوضوح أحتاج إلى استخدام glRotate() للحصول على القرص الذي يواجه بشكل صحيح ولكن ما يجب أن يكون الدوران؟ أتذكر أن هذا يمكن حسابه باستخدام الأوامرات ولكني لا يبدو لي أن أتذكر الرياضيات.

هل كانت مفيدة؟

المحلول

يجب أن يكون الحل واضحا جدا، ويجب ألا يتطلب الاحتياطات.

يجب أن يكون محور التناوب للوصول من Normal1 إلى Normal2 أكثر متعامدا إلى كليهما، لذلك فقط تأخذ ناقلات المنتج عبر.

يتم استخلاص كمية التناوب بسهولة من المنتج نقطة. وبعد هذه القيمة هي | A |. | B | .cos (Theta)، ولكن كما يجب تطبيع ناقلات عادية، سيعطي COS (Theta)، لذلك فقط تأخذ جيب التمام العكسية للحصول على مبلغ الدوران.

المتجه الناتج والزاوية هي المعلمات المطلوبة ل glRotate() - ليست هناك حاجة لحساب مصفوفة الدوران الفعلية بنفسك.

ملاحظة لا تنس ذلك glRotate() يحتاج إلى الزاوية في الدرجات، ولكن تعمل وظائف Trig العادية C في الراديان.

نصائح أخرى

دوران حول محور التعسفي: زاوية معينة R في الرضيات والوحدة ناقلات U = AI + BJ + CK أو [A، B، C]، حدد:

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

وبناء من هذه القيم مصفوفة الدوران:

   ( 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 )

للعثور على الدوران الذي تحتاجه للقيام به، يمكنك حساب المنتج الصغير بين المتجه الحالي والمتجه الهدف. ستحصل على ناقل متعامد (الذي سيكون ناقلات دورانك لإنشاء Quaternion) وطول هذا المتجه هو خطيئة الزاوية التي يجب عليك تعويضها بحيث تداخل المتجهات البداية والمستهدفة.

يصف الأوغة دوران حول محور. <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>.

لتدوير الرقم من مواجهة المحور Z الإيجابي، لمواجهة المتجه <x,y,z> تحتاج إلى العثور على ناقلات التناوب وزاوية الدوران. للعثور على محور الدوران، يمكنك أن تأخذ المنتج المتبادل من متجه الحالي، وأين تريد أن تكون.

إذا كنت تواجه المحور Z الإيجابي، فإن المتجه الحالي سيكون <0, 0, 1>. وبعد إذا كنت تريد أن تواجه <x,y,z>, ، سيكون محور الدوران <0, 0, 1> x <x, y, z> = <-y, x, 0>, ، والزاوية ستكون arctan(sqrt(x^2+y^2),z). وبعد يصبح Quaternion

<cos(θ/2), -y*sin(θ/2), x*sin(θ/2), 0>, where θ = arctan(sqrt(x^2+y^2), z)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top