Question

Je dessine un disque plat en utilisant gluDisk() dans ma scène. gluDisk() tire le disque face à l'axe Z positif, mais je veux que ce soit face à certains que j'ai normale arbitraire.
Il est clair que je dois utiliser glRotate() pour obtenir le disque face correctement, mais ce qui doit être la rotation? Je me souviens, cela peut être calculé à l'aide Quaternions mais je ne peux pas sembler se rappeler le calcul.

Était-ce utile?

La solution

La solution doit être assez simple et ne devrait pas nécessiter quarternions.

L'axe de rotation pour obtenir de normale1 à Normal2 doit être perpendiculaire à la fois, donc il suffit de prendre le contre-produit vecteur .

La quantité de rotation se déduit aisément de leur produit scalaire . Cette valeur est | A |. | B |. .Cos (thêta), mais comme les deux vecteurs normaux devraient être normalisés, il donnera cos (thêta), alors prenez juste le cosinus inverse pour obtenir la quantité de rotation

Le vecteur et l'angle résultant sont les paramètres requis pour glRotate() - il n'y a pas besoin de calculer la matrice de rotation réelle vous-même.

p.s. ne pas oublier que glRotate() a besoin de l'angle en degrés, mais les fonctions normales C trigonométriques travaillent dans radians.

Autres conseils

rotation autour d'un axe arbitraire: r angle donné en radians et vecteur unitaire u = ai + bj + ck ou [a, b, c], définir:

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

et de construire à partir de ces valeurs de la matrice de rotation:

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

Pour la rotation que vous devez faire, vous pouvez calculer le produit croisé entre le vecteur courant et le vecteur cible. Vous obtiendrez le vecteur orthogonal (qui sera votre vecteur de rotation pour créer le quaternion) et la longueur de ce vecteur est le péché de l'angle que vous devez compenser de sorte que le chevauchement début et vecteur cible.

Quaternions décrivent une rotation autour d'un axe. <w,x,y,z> tournera autour de l'axe <x,y,z> une certaine quantité en fonction de l'équilibre entre l'ampleur de w et l'ampleur du vecteur.

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

Par exemple, tourner pour faire face à l'axe Y positif à la place, vous devez le faire pivoter de 90 ° autour de l'axe X. Le vecteur serait <0, 1, 0> et le quaternion serait <cos 90°, 0, sin 90°, 0> = <0, 0, 1, 0>.

Pour faire pivoter la figure de face à l'axe Z positif, à la face <x,y,z> antivectorielle vous devez trouver la rotation de vecteur et de l'angle de rotation. Pour trouver l'axe de rotation, vous pouvez prendre la croix-produit d'un vecteur courant, et où vous voulez qu'il soit.

Si elle fait face à l'axe Z positif, le vecteur courant serait <0, 0, 1>. Si vous voulez faire face <x,y,z>, la rotation de l'axe serait <0, 0, 1> x <x, y, z> = <-y, x, 0>, et l'angle serait arctan(sqrt(x^2+y^2),z). Le quaternion devient

<cos(θ/2), -y*sin(θ/2), x*sin(θ/2), 0>, where θ = arctan(sqrt(x^2+y^2), z)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top