2013-09-01 23 views
6

Jak utworzyć Obrót macierz Z kierunku (wektor jednostkowy)Kierunek wektora rotacji Matrix

Moja matryca jest 3x3, Kolumna major i prawą rękę

I Know 'kolumna1' ma rację 'column2' jest do góry i 'kolumna3' jest do przodu

Ale nie mogę tego zrobić.

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

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

W przypadku macierzy obrotu potrzebny jest wektor kierunkowy (np. Oś) ** i ** kąt. Biorąc pod uwagę tylko kierunek, o którym mówisz? – 6502

+0

Chcę to zrobić: Vec3 dirToEnemy = (Enemy.Position - Player.Position) .normalize(); Player.Matrix.makeRotationDir (dir); Player.Attack(); – UfnCod3r

+0

@ 6502: nie, dla macierzy obrotu można również użyć trzech wektorów (x, y, z) – SigTerm

Odpowiedz

5

Dzięki wszystkim. Rozwiązany.

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

Więc jeśli kierunek odpowiada górze, nie jest stosowane obracanie? –

2

Aby zrobić to, co chcesz zrobić w swoim komentarzu, musisz znać poprzednią orientację gracza. Właściwie najlepszą rzeczą do zrobienia jest przechowywanie wszystkich danych dotyczących pozycji i orientacji odtwarzacza (i prawie wszystkiego w grze) w macierzy 4x4. Odbywa się to poprzez "dodanie" czwartej kolumny i czwartego rzędu do macierzy obrotu 3x3 i użycie dodatkowej kolumny do przechowywania informacji o pozycji gracza. Matematyka za tym (homogeniczne współrzędne) jest dość prosta i bardzo ważna zarówno w OpenGL, jak i DirectX. Proponuję wam tę wielką samouczek http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/ Teraz, aby obrócić swój odtwarzacz w kierunku wroga, za pomocą GLM, można to zrobić:

1) W klasach graczy i wroga, oświadczam, macierz i wektor 3D na stanowisko

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

2) obrócić w kierunku wroga z

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), aby obrócić w kierunku wroga odtwarzaczu zrobić

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 

Jeśli chcesz zapisać wszystko w matrycy, nie deklaruje pozycję jako zmienna, ale jako funkcja

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

i obracać z

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