2013-09-01 11 views
6

Come creare matrice di rotazione Da Senso (versore)Direzione Vector Per rotazione Matrix

La mia matrice è 3x3, Colonna Maggiore, e il diritto a mano

I Know 'column1' è giusto, 'column2' è up e 'column3' è in avanti

Ma non posso farlo.

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

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

Per una matrice di rotazione è necessario un vettore di direzione (ad esempio un asse) ** e ** un angolo. Dato solo una direzione di quale rotazione stai parlando? – 6502

+0

voglio fare questo: Vec3 dirToEnemy = (Enemy.Position - Player.Position) .normalize(); Player.Matrix.makeRotationDir (dir); Player.Attack(); – UfnCod3r

+0

@ 6502: no, per la matrice di rotazione è anche possibile utilizzare tre vettori (x, y, z) – SigTerm

risposta

5

grazie a tutti. Risolto.

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

Quindi se la direzione corrisponde a su nessuna rotazione viene applicata? –

2

Per fare ciò che si desidera fare nel commento, è inoltre necessario conoscere l'orientamento precedente di Youe Player. In realtà, la cosa migliore da fare è memorizzare tutti i dati relativi alla posizione e all'orientamento del tuo giocatore (e quasi qualsiasi altra cosa in un gioco) in una matrice 4x4. Questo viene fatto aggiungendo una quarta colonna e una quarta riga alla matrice di rotazione 3x3, e usa la colonna extra per memorizzare le informazioni sulla posizione del giocatore. La matematica dietro a questo (coordinate omogenee) è abbastanza semplice e molto importante sia in OpenGL che in DirectX. Vi suggerisco questa grande esercitazione http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/ Ora, per ruotare il lettore verso il tuo nemico, utilizzando GLM, si può fare questo:

1) Nelle vostre classi dei giocatori e nemici, dichiarare una matrice e 3D vettoriale per la posizione

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

2) ruotano verso nemico con

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) per ruotare il nemico verso il giocatore, fanno

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 

Se si desidera memorizzare tutto nella matrice, non dichiarano la posizione come una variabile, ma come una funzione

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

e ruotare con

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 
Problemi correlati