2013-09-01 83 views
6

Làm thế nào để Tạo ma trận xoay Từ Direction (đơn vị vector)Direction Vector Để Rotation Matrix

Matrix tôi là 3x3, Column Major, Và Right Hand

I Know 'column1' là đúng, 'column2' là lên và 'column3' đang chuyển tiếp

Nhưng tôi không thể thực hiện việc này.

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

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

Đối với ma trận xoay, bạn cần véc tơ hướng (ví dụ: trục) ** và ** góc. Chỉ định hướng bạn đang nói về vòng xoay nào? – 6502

+0

tôi muốn làm điều này: Vec3 dirToEnemy = (Enemy.Position - Player.Position) .normalize(); Player.Matrix.makeRotationDir (dir); Player.Attack(); – UfnCod3r

+0

@ 6502: không, đối với ma trận xoay, bạn cũng có thể sử dụng ba vectơ (x, y, z) – SigTerm

Trả lời

5

Nhờ tất cả. Giải quyết.

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

Vì vậy, nếu hướng tương ứng với không có vòng quay được áp dụng? –

2

Để làm những gì bạn muốn làm trong nhận xét, bạn cũng cần biết định hướng trước đó của người chơi. Trên thực tế, điều tốt nhất cần làm là lưu trữ tất cả dữ liệu về vị trí và hướng của trình phát của bạn (và hầu như mọi thứ khác trong trò chơi) vào ma trận 4x4. Điều này được thực hiện bằng cách "thêm" một cột thứ tư và hàng thứ tư vào ma trận xoay 3x3 và sử dụng cột phụ để lưu trữ thông tin về vị trí của trình phát. Toán học đằng sau này (tọa độ đồng nhất) khá đơn giản và rất quan trọng trong cả OpenGL và DirectX. Tôi đề nghị bạn hướng dẫn tuyệt vời này http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/ Bây giờ, để xoay nghe nhạc của bạn đối với kẻ thù của bạn, sử dụng GLM, bạn có thể làm điều này:

1) Trong lớp người chơi và kẻ thù của bạn, khai báo một ma trận và vector 3d cho vị trí

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

2) xoay về phía kẻ thù với

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) để xoay kẻ thù đối với các cầu thủ, làm

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 

Nếu bạn muốn lưu trữ tất cả mọi thứ trong ma trận, không khai báo vị trí như là một biến nhưng như một hàm

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

và xoay với

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