2013-09-01 6 views
6

So erstellen Rotation Matrix Aus Richtung (Einheitsvektor)Vector Richtung Rotation Matrix

My Matrix 3x3, Spalte Major, und die rechte Hand

I Know 'column1' ist richtig, 'column2' ist up und 'column3' ist vorwärts

Aber ich kann das nicht tun.

//3x3, Right Hand 
struct Mat3x3 
{ 
    Vec3 column1; 
    Vec3 column2; 
    Vec3 column3; 

    void makeRotationDir(const Vec3& direction) 
    { 
     //:((
    } 
} 
+1

Für eine Rotationsmatrix benötigen Sie einen Richtungsvektor (z. B. eine Achse) ** und ** einen Winkel. Angesichts nur einer Richtung, über welche Rotation sprechen Sie? – 6502

+0

Ich möchte dies tun: Vec3 dirToEnemy = (Feind.Position - Player.Position) .normalize(); Spieler.Matrix.makeRotationDir (dir); Spieler.Attack(); – UfnCod3r

+0

@ 6502: Nein, für Rotationsmatrix können Sie auch drei Vektoren verwenden (x, y, z) – SigTerm

Antwort

5

Dank an alle. Gelöst.

struct Mat3x3 
{ 
    Vec3 column1; 
    Vec3 column2; 
    Vec3 column3; 

    void makeRotationDir(const Vec3& direction, const Vec3& up = Vec3(0,1,0)) 
    { 
     Vec3 xaxis = Vec3::Cross(up, direction); 
     xaxis.normalizeFast(); 

     Vec3 yaxis = Vec3::Cross(direction, xaxis); 
     yaxis.normalizeFast(); 

     column1.x = xaxis.x; 
     column1.y = yaxis.x; 
     column1.z = direction.x; 

     column2.x = xaxis.y; 
     column2.y = yaxis.y; 
     column2.z = direction.y; 

     column3.x = xaxis.z; 
     column3.y = yaxis.z; 
     column3.z = direction.z; 
    } 
} 
+0

Also, wenn die Richtung nach oben entspricht, wird keine Rotation angewendet? –

2

zu tun, was Sie in Ihrem Kommentar machen wollen, müssen Sie auch die bisherige Ausrichtung von youe Spieler kennen. Eigentlich ist es das Beste, alle Daten über Position und Ausrichtung Ihres Spielers (und fast alles andere in einem Spiel) in einer 4x4-Matrix zu speichern. Dies geschieht durch "Hinzufügen" einer vierten Spalte und einer vierten Zeile zu der 3 × 3 Rotationsmatrix und Verwenden der zusätzlichen Spalte zum Speichern der Information über die Spielerposition. Die Mathematik dahinter (homogene Koordinaten) ist ziemlich einfach und sehr wichtig in OpenGL und DirectX. Ich schlage vor, diese großen Tutorial http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/ Jetzt Ihren Player auf Ihrem Gegner zu drehen, mit GLM, können Sie dies tun:

1) In Ihrem Player und feindlichen Klassen, eine Matrix und 3D-Vektor für die Position erklären

glm::mat4 matrix; 
glm::vec3 position; 

2) drehen in Richtung Feind mit

player.matrix = glm::LookAt(
player.position, // position of the player 
enemy.position, // position of the enemy 
vec3(0.0f,1.0f,0.0f));  // the up direction 

3) den Gegner gegenüber dem Spieler zu drehen, tun

enemy.matrix = glm::LookAt(
enemy.position, // position of the player 
player.position, // position of the enemy 
vec3(0.0f,1.0f,0.0f));  // the up direction 

Wenn Sie alles in der Matrix gespeichert werden sollen, nicht ausdrücklich erklären, die Position als Variable, sondern als Funktion

vec3 position(){ 
    return vec3(matrix[3][0],matrix[3][1],matrix[3][2]) 
} 

und dreht mit

player.matrix = glm::LookAt(
player.position(), // position of the player 
enemy.position(), // position of the enemy 
vec3(0.0f,1.0f,0.0f));  // the up direction 
Verwandte Themen