2012-03-24 46 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