我正在使用Opengl作为小型汽车模拟的基础。
我已经进口了一辆模型车,它开得很好,相机跟着它。不幸的是,当汽车转弯时,我似乎无法让相机的位置移动(或留在汽车后面)。它只是在现场旋转。
例如,如果汽车向左转,相机会旋转跟随它,但不会直接移动到汽车后面。
我已经查看了这些问题here和here,但似乎无法让它发挥作用。
这是我计算汽车位置的方法(它现在只在XZ平面上行驶):
velocity.x = sin(rotX_rad);
velocity.z = cos(rotX_rad);
globalPos.x + velocity.x*delta;
globalPos.z + velocity.z*delta;
glTranslatef(globalPos.x,globalPos.y,globalPos.z);
glRotatef(rotX, 0.0, 1.0, 0.0);
目前这是我的lookAt功能:
gluLookAt(camX+globalPos.x,
camY+globalPos.y,
camZ+globalPos.z,
lookX+globalPos.x+sin(rotX_rad),
lookY+globalPos.y+cos(rotX_rad),
lookZ+globalPos.z-cos(rotX_rad),
camNX, camNY, camNZ);
我希望相机像这样:( Y是Z)
我看到的方式应该是:
camX + globalPos.x+ sin(rotX_rad)*(distFromCar),
camY,
camZ + globalPos.z- cos(rotX_rad)*(distFromCar),
但它表现得很奇怪......
我不做什么?
答案 0 :(得分:2)
给它一个镜头,它在我的头脑中是有意义的,但实际上可能不是这样:)
好的,我们可以将你的汽车的位置和速度表示为2元素向量(在位置的情况下,它是一个点,在速度的情况下,它是一个真正的向量。)
现在我们已经知道了,为了计算摄像机的位置,我们可以采用速度矢量的负值(这意味着只需使矢量的所有元素为负,产生相同幅度但完全相反方向的矢量)并将该矢量添加到您的汽车位置。
例如,假设您的汽车位于(1,1)位置且您的速度矢量为(1,2)。负速度矢量为(-1,-2),摄像机的位置为(1,1)+( - 1,-2)为(0,-1)。您可能需要对负速度矢量进行标准化,以使您的相机与汽车保持恒定距离,否则相机拍摄速度越快,您就越快:)
现在您已拥有相机的位置,只需调用gluLookAt:
gluLookAt(camPos.x,camPos.y,camPos.z,carPos.x,carPos.y,carPos.z,0,1,0);
正如您所看到的,我们正在传递相机的位置(我们刚刚在上一步中计算过)并告诉相机看车。您可能想要调整一些值(例如,让相机从地面漂浮几个单位,而不是直接在车后面,或者让相机看到汽车上方几个单位的点等)。 / p>
让我知道这是怎么回事!再一次,这只是我认为可能适合你的东西,不能保证我的数学是正确的:)但是这应该更快更容易理解而不是弄乱角度等。要记住的一点是:如果汽车完全静止(没有速度矢量),这将不起作用