【发布时间】:2011-05-01 08:33:06
【问题描述】:
我正在处理一个 opengl c++ 项目,我在其中画了一个球员和一个球在他的右手。首先,我想通过设置球的位置让球跟随球员的手部运动。一段时间后,我需要使用运动学方程让球移动。我得到了玩家右手变换矩阵(我在绘制玩家的那一刻就这样做了):
glGetFloatv(GL_MODELVIEW_MATRIX, ball->transformMatrix);
然后在我画球的那一刻,我尝试去做:
glLoadMatrixf(ball->transformMatrix);
glTranslated(0, 0, 0);
glCallList(lists[BALL]);
这很完美,并且球在适当的位置绘制。
问题是当我需要移动球时
x += velocityX*dt;
y += velocityY*dt + gravity*dt*dt;
z += velocityZ*dt;
velocityY += gravity*dt;
移动与玩家变换无关,而是与全局相关。我尝试了很多方法来解决这个问题,但都没有奏效。
那么我如何正确计算球的 x、y、z,以便在球离开球员手后平移球?
编辑:
我已经设法通过将 ball->transformMatrix 与向量 {0, 0, 0, 1} 相乘来接收球坐标,结果存储在世界向量中,之后调用(我画球的那一刻):
glGetFloatv(GL_MODELVIEW_MATRIX, currentTransformMatrix);
然后反转 currentTransformMatrix 并将逆乘以世界向量。结果是球的正确坐标 {x, y, z}。
【问题讨论】:
-
请不要滥用 OpenGL 作为矩阵数学库。这是尴尬和低效的。最好使用真正的矩阵数学库并使用 glLoadMatrix 和 glMultMatrix 将矩阵应用于 OpenGL。 BTW:OpenGL-3.1 完全移除了所有矩阵函数!