2016-06-25 1 views
0

J'ai une position d'un caractère comme coordonnées xyz x = 102, y = 0,75, z = -105,7 par exemple. Et j'ai la matrice de rotation pour le caractèrematrice de rotation pour faire face au vecteur de direction

M11 = -0.14 
M12 = 0 
M13 = -0.99 
M21 = 0 
M22 = 1 
M23 = 0 
M31 = 0.99 
M32 =0 
M33 = 0.14 

Je n'ai pas beaucoup de compréhension sur les graphiques et la façon dont ces données peuvent en corrélation avec la direction en regard du caractère. Je veux trouver un vecteur tel que je puisse utiliser ce vecteur pour viser une direction à laquelle le personnage fait face. Comment je fais ça?

+0

D'où obtenez-vous ces matrices? –

+0

S'agit-il de [tag: unity3d], [tag: xna] ou général [tag: maths]? Parce qu'au moins XNA fournit une propriété simple pour obtenir la direction face. –

+0

J'utilise xna. Les valeurs matricielles et la position proviennent de la mémoire d'un jeu. La position est précise et testée. Je ne suis pas sûr des valeurs de la matrice ... Je construis une matrice en utilisant les 9 valeurs ci-dessus, puis j'obtiens un vecteur de la méthode matrix.forward. mais il ne me donne pas la direction face à face correctement, car si je tire quelque chose (tirer une animation) dans cette direction, ce n'est pas la direction que le personnage est confronté. –

Répondre

1

La direction de votre personnage est la 3ème ligne de la matrice de rotation. Donc, ce serait:

Vector3 facingDirection = new Vector3(0.99f, 0f, 0.14f);//(m31,m32,m33) 

ce vecteur semble être normalisé, mais s'il n'y avait pas, vous feriez:

Vector3 facingDirection = Vector3.Normalize(new Vector3(0.99f, 0f, 0.14f)); 

Si la matrice est une matrice XNA, alors vous suffit d'utiliser la propriété Matrix.Forward de la structure Matrix et obtient le même résultat.

+0

Salut Steve, je fais déjà ce que vous suggérez, mais le problème est que je veux tirer dans cette direction à partir de la position du personnage. Disons que j'ai un feu de commandement x = 1, y = 2, z = 3 pour tirer à la position (1,2,3) de la position actuelle du personnage. Maintenant, si j'utilise le vecteur de direction x, y, z pour cette commande, sera-t-il tiré parallèlement à la direction opposée à partir de la position actuelle du personnage? ou dois-je faire un calcul supplémentaire? –

+0

Merci, @Steve, je suis enfin capable de le résoudre –

1

Je suis enfin capable de le résoudre. En fait, ce sont des mathématiques vectorielles assez simples. La matrice de rotation me donnait déjà le vecteur de direction comme Steve le suggère ci-dessus, mais je devais tirer le long de cette ligne jusqu'à un point particulier pour faire fonctionner mon animation ... Donc j'avais besoin d'un point le long de la ligne. Donc, j'ai juste calculé un point à environ 1000 unités de la position actuelle du personnage le long du vecteur de direction et j'ai tiré sur la ligne, ça a marché!

Vector3 facingDirection = new Vector3(RotMatrix[2, 0], RotMatrix[2, 1], RotMatrix[2, 2]); // direction vector 
        Vector3 currentPos = new Vector3(character.PosX, character.PosY, character.PosZ); // I also have position of the character 
// Now calculate a point 10000 units away along the vector line 
        var px = currentPos.X + facingDirection.X * 10000; 
        var py = currentPos.Y + facingDirection.Y * 10000; 
        var pz = currentPos.Z + facingDirection.Z * 10000; 
        return new Vector3(px, py, pz);