Question

J'ai 3 vecteurs, jusqu'à droite et avant qui représentent une direction.

Je dois convertir en un angle XYZ (3 flotteurs) donc je peux utiliser avec glRotatef ()

S'il vous plaît aider

[EDIT]

Ce ne est pas rendu correctement. pouvez-vous voir si son tout flagrant ici: pastebin.com/f6683492d

Était-ce utile?

La solution

Je suppose que vous voulez dire « vers le haut, à droite et en avant » parce que vers le bas est à l'opposé de et ne contribue pas Relly toute nouvelle information.
Votre question n'est pas très clair, mais je pense que vous voulez dire que vous voulez créer une transformation à la nouvelle coordonnées de base qui est définie par les vecteurs que vous décrivez. Si ces vecteurs sont orthogonaux (90 degrés ont entre eux) alors vous n'avez pas besoin de passer par tous les angles pris la peine de calcul et à l'aide glRotate (). vous pouvez plutôt utiliser les vecteurs de la nouvelle base directement la transformation.

Dites les vecteurs que vous avez sont A (a1, a2, a3) - up, B (b1, b2, b3) - droit et C (c1, c2, c3) - vers l'avant. Tout d'abord, si les ne sont pas vous complètement orthogonal devez vous assurer qu'ils deviennent orthogonale, peut-être avec quelques produits croisés. En second lieu, vous devez vous assurer que leur longueur est 1. Créez maintenant la matrice suivante:

a1 b1 c1 0
a2 b2 c2 0
a3 b3 c3 0
0  0  0  1

Ceci est la matrice de rotation qui vous amènera de la base de l'unité à la base définie par A, B, C Avec cette matrice tout ce que vous devez faire est d'utiliser glMultMatrix () et vous avez terminé. Si le premier essai ne fonctionne pas, la transposition de la matrice serait probablement corriger.


EDIT Après avoir vérifié à nouveau, le bon ordre de la matrice devrait être comme ceci: pour le vecteur A (ax, ay, az), B (bx, by, bz), C (cx, cy, cz)

ax ay az 0
bx by bz 0
cx cy cz 0
0  0  0  1

Ceci est la transposition de la réponse ci-dessus. Je recommande également que vous essayez d'abord de voir si cela fonctionne sans traduction. Et vous pouvez ajouter une traduction en ajoutant simplement à la matrice comme ceci:

ax     ay     az     0
bx     by     bz     0
cx     cy     cz     0
pos.x  pos.y  pos.z  1

Autres conseils

x = acos( dp3( nrm( up ), new vec3( 0, 1, 0 ) ) );
y = acos( dp3( nrm( dir ), new vec3( 0, 0, 1 ) ) );
z = acos( dp3( nrm( right ), new vec3( 1, 0, 0 ) ) );

où DP3 est un produit scalaire à 3 composants, NRM normalise un vecteur à 3 composants et construit une vec3 tel que défini.

Cela vous donnera l'angle entre le VECTR que vous avez et a par défaut base de coordonnées.

Edit: Bien sûr, comme indiqué ci-dessus, vous avez probablement déjà une matrice de base que vous pouvez appliquer. Très facile à Orthonormalise aussi bien. De façon réaliste, je ne peux pas penser à un moment où vous auriez besoin de faire ce que je l'ai fait ci-dessus .. mais .. hey ... son que vous avez demandé;)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top