2010-04-08 6 views

Répondre

0

Eh bien c'est définitivement faisable. Vous devez définir une base orthonormale telle que les deux objets se pointent l'un l'autre. Je vais supposer que votre cône est configuré de telle sorte que le point soit en bas de l'axe Z (vous devez garder cela à l'esprit).

cône A est à la position P
cône B est à la position Q

La direction de A à B est = Q - P et B à A est P - Q. Tout d'abord nous devons normaliser les deux ces vecteurs sont donc maintenant des vecteurs de direction unitaire. Nous les appellerons A 'et B', respectivement, pour plus de commodité (ce sont les deux vecteurs de direction maintenant).

Nous pouvons supposer, pour le moment, que le vecteur haut (Nous l'appellerons U) est 0, 1, 0 (attention, les calculs ici tomberont si A ou B est très proche de ce vecteur mais pour l'instant je ne vais pas m'inquiéter à ce sujet).

Nous avons maintenant besoin du vecteur latéral et du vecteur true up. Heureusement, nous pouvons calculer quelque chose qui est perpendiculaire au plan formé par le vecteur Up et A 'ou B' en utilisant un produit croisé.

Ainsi, le vecteur latéral (S) est calculé comme suit ... A 'x U. Maintenant, nous avons ce vecteur latéral, nous pouvons calculer le vrai vecteur Up en faisant A' x S. Cela nous fournit maintenant 3 vecteurs dont nous avons besoin pour une base orthonormale. Vous pouvez normaliser ces deux vecteurs pour éliminer toutes les erreurs qui se sont accumulées, mais un produit croisé de deux vecteurs unitaires devrait toujours être un vecteur unitaire, de sorte que toutes les erreurs seraient légères, ce qui ne vaut probablement pas la peine.

En utilisant cette information, nous pouvons maintenant construire la matrice pour cône A.

S.x, S.y, S.z, 0 
U.x, U.y, U.z, 0 
A'.x, A'.y, A'.z, 0 
P.x, P.y, P.z, 1 

Effectuer les mêmes calculs pour les deux cônes et ils pointent maintenant vers l'autre. Si vous déplacez l'un ou l'autre cône, recalculez comme ci-dessus pour les deux cônes et ils pointeront toujours l'un vers l'autre.

Cela vaut la peine de noter que le format de matrice que j'ai utilisé est la disposition par défaut de DirectX (rangée principale). C'est tout à fait possible que C# (et donc XNA?) Utilise un format majeur de colonne. Si oui, vous devez jeter les amtrices comme suit:

S.x, U.x, A'.x, P.x 
S.y, U.y, A'.y, P.y 
S.z, U.z, A'.z, P.z 
0, 0, 0, 1 

Notez la seule différence entre les 2 matrices est le fait que les lignes et les colonnes ont été permutées. Cela fait que la seconde matrice transpose de la 1ère matrice (et vice versa).