我设法使用键盘事件在OpenGL中开发基本的汽车模拟,用于汽车的移动。我遇到麻烦的问题是在我向左或向右转向之后得到我的车的位置。我这样做是使用glTranslatef()glRotatef()glTranslatef()模型来绕着Y轴上的一个点旋转我的汽车,这样汽车只能在XZ平面上移动。
总结了renderScene函数:
void renderScene( void ) {
glMatrixMode(GL_MODELVIEW);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(cameraX,cameraY,cameraZ,lookAtX,0,lookAtZ,upX, upY, upZ);
glPushMatrix();
if (steerLeft){
glTranslatef(xTemp,0,zTemp+R);
glRotatef(angle,0,1,0);
glTranslatef(-xTemp,0,-zTemp-R);
}
else
if (steerRight){
glTranslatef(-xTemp,0,-zTemp-R);
glRotatef(angle,0,1,0);
glTranslatef(xTemp,0,zTemp+R);
}
else{
glRotatef(angle,0,1,0);
glTranslatef(x1,0,z1);
}
glutWireCube(1,1,1);
glPopMatrix();
glutSwapBuffers();
}
其中x1在按下W,S键后相应地递增/递减,当我按下W + A或W + D时,角度也相应地改变,以便旋转表现得如预期的那样(值得一提的是我正在处理使用一系列转换而不仅仅是单个Translate-> Rotate-> Translate)。
就R而言,如果它围绕该点在一个方向上转360,那么它将是对象形成的圆的半径。 xTemp和zTemp变量使对象在转向之前保持正确位置。
我搜索了这个问题的答案,并找到了一些我应该使用的建议:glGetDoublev(GL_MODELVIEW_MATRIX, m)
函数存储当前矩阵并使用m [12]获取变换后的对象的x,z坐标,m [14],但我无法使其发挥作用。
我很确定我在这里遗漏了一些简单的东西,因为OpenGL已经在为我做这些计算,在屏幕上设置对象的位置,而我所需要的只是“最后的计算”,这意味着最后的经过多次旋转后,我的物体的位置。