2013-09-01 20 views
6

Yön Vektör

Benim Matris El

Ben 'column1' bilin 3x3, Sütun Binbaşı, Ve sağ mı haklı Yön itibaren (birim vektör) Rotasyon matrisi oluşturma Nasıl

, 'sütun2' dir yukarı ve 'column3' ileride

Ancak bunu yapamam.

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

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

Döndürme matrisi için bir yön vektörüne (örneğin, bir eksen) ** ve ** bir açının olması gerekir. Sadece bir yön verildiğinde hangi rotasyondan bahsediyorsun? – 6502

+0

Bunu yapmak istiyorum: Vec3 dirToEnemy = (Enemy.Position - Oyuncu.Position) .normalize(); Oyuncu.Matrix.makeRotationDir (dir); Player.Attack(); – UfnCod3r

+0

@ 6502: Hayır, döndürme matrisi için üç vektörü de kullanabilirsiniz (x, y, z) – SigTerm

cevap

5

teşekkür döndürmek yoktur. Çözüldü.

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

Yani eğer yön yukarı yönde değilse, dönüş yapılmıyor mu? –

2

Yorumunuzda yapmak istediğiniz şeyi yapmak için, youe Player'ın önceki yönlendirmesini de bilmeniz gerekir. Aslında, yapılacak en iyi şey, oynatıcınızın pozisyonu ve oryantasyonu hakkındaki tüm verileri (ve oyundaki hemen hemen her şey) bir 4x4 matrisinde saklamaktır. Bu, dördüncü bir sütunu ve dördüncü sırayı 3x3 rotasyon matrisine "ekleyerek" yapılır ve oyuncu konumu hakkındaki bilgileri saklamak için ekstra sütunu kullanın. Bunun arkasındaki matematik (homojen koordinatlar) hem OpenGL hem de DirectX'te oldukça basit ve çok önemlidir. Ben GLM kullanarak, düşmanın karşı çalarınızı döndürmek için, Şimdi bu harika öğretici http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/ önermek, bunu yapabilirsiniz: En çalar ve düşman sınıflarında

1), pozisyon için bir matris ve 3d vektör beyan

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

2),

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) oyuncuya karşı düşman döndürmek için düşmanın doğru döndürün

do Eğer matris içinde her şeyi saklamak istiyorsanız

,

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

bir değişken olarak değil bir fonksiyonu olarak konumunu bildirmek ve tüm To

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