C++ 如何更新变换矩阵(NewtonGameDyanmics/OpenGL)?

C++ 如何更新变换矩阵(NewtonGameDyanmics/OpenGL)?,c++,opengl,game-physics,physics-engine,C++,Opengl,Game Physics,Physics Engine,我试图用牛顿物理和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 * collis

我试图用牛顿物理和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;

我的问题是如何使用matrixbox.mat绘制一个实际为8点的立方体?如何使用矩阵计算更新的顶点

> P> >将顶点视为列向量,并将其乘以矩阵。

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部分的模型矩阵。

请让我知道如何执行第二部分,为OpenGL提供未更改的顶点,并简单地使用box.mat作为OpenGL的模型矩阵?假设当前矩阵堆栈是GL\u MODELVIEW,并且该堆栈上的当前矩阵是视图矩阵,然后调用glmultttransposematrixfbox.mat。这假设您使用的是行主矩阵,这与我在实际答案中编写代码时使用的假设相同。不,您不需要转置牛顿矩阵来将其传递给OpenGL。只需调用glMultMatrixfm;若m是矩阵,你们可以从NewtonBodyGetMatrix函数中得到。