2012-03-24 76 views
0

我想模擬使用牛頓物理和OpenGL的旋轉框。這是我實施的。如何更新變換矩陣(NewtonGameDyanmics/OpenGL)?

float mat44[16] = { 
    1,0,0,0, 
    0,1,0,0, 
    0,0,1,0, 
    0,0,0,1 
}; 

box.mat = &mat44[0]; 
box.x_size = 0.50; 
box.y_size = 0.50; 
box.z_size = 0.50; 

nWorld = NewtonCreate(NULL, NULL); 

NewtonCollision * collision = NULL; 
collision = NewtonCreateBox(nWorld, box.x_size, box.y_size, box.z_size,NULL); 
body = NewtonCreateBody(nWorld, collision); 
NewtonReleaseCollision (nWorld, collision); 
NewtonBodySetMassMatrix(body, 10.0, 2.0, 2.0, 2.0); 
NewtonBodySetMatrix (body, box.mat); 
float omega[3] = {0.0f, 10.0f, 0.0f}; 
NewtonBodySetOmega (body, &omega[0]); 

在渲染循環內我正在做這些事情。

NewtonUpdate(nWorld, time); 
float m[16]; 
NewtonBodyGetMatrix(body, &m[0]); 
box.mat = m; 

我的問題是如何使用矩陣(box.mat)繪製一個立方體(實際上8點)?我怎樣才能使用矩陣計算更新的頂點?

回答

0

你考慮頂點爲列向量,並用它乘以你的矩陣。

r.x = v.x * m[0] + v.y * m[1] + v.z * m[2] + m[3] 
r.y = v.x * m[4] + v.y * m[5] + v.z * m[6] + m[7] 
r.z = v.x * m[8] + v.y * m[9] + v.z * m[10] + m[11] 

其中[V.X,V.Y,V.Z,1]是頂點位置和r是輸出頂點。順便說一下,如果你使用的是OpenGL,「正確的」事情是向OpenGL提供未改變的頂點,並簡單地使用box.mat作爲OpenGL(模型視圖矩陣的一部分)的「模型矩陣」。

+0

請讓我知道如何做到這一點的第二部分(飼料的OpenGL不變的頂點和簡單的使用box.mat爲「模型矩陣」的OpenGL)? – shan 2012-03-24 04:22:50

+0

假設當前的矩陣堆棧是'GL_MODELVIEW',並且該堆棧上的當前矩陣是您的視圖矩陣,那麼您可以調用'glMultTransposeMatrixf(box.mat)'。這假定你正在使用行主矩陣,這與我在實際答案中編寫代碼的假設是一樣的。 – 2012-03-24 04:24:27

+1

不,你不需要轉置牛頓矩陣將其傳遞給OpenGL。只需調用glMultMatrixf(m);如果m是從NewtonBodyGetMatrix函數獲得的矩陣。 – 2012-03-24 09:37:27