根据 3D 对象的位置旋转相机
Posted
技术标签:
【中文标题】根据 3D 对象的位置旋转相机【英文标题】:Rotating Camera according to 3D Object's position 【发布时间】:2014-04-04 15:19:31 【问题描述】:我使用 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);
这就是我目前的外观功能:
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),
但它的行为很奇怪....
我没有做什么?
【问题讨论】:
【参考方案1】:试一试,这在我的脑海中是有道理的,但在现实中可能没有:)
好的,所以我们可以将您的汽车的位置和速度表示为 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);
如您所见,我们正在传递相机的位置(我们刚刚在上一步中计算)并告诉相机看汽车。您可能想要调整一些值(例如,让相机漂浮在离地面几个单位的位置,而不是直接在汽车后面,或者让相机看着汽车上方几个单位的点等)
让我知道这是怎么回事!再说一次,这只是我认为可能对你有用的东西,但不能保证我的数学是正确的 :) 但这应该比弄乱角度等更快更容易理解。要记住的一件事:如果汽车完全静止(没有速度矢量),这将不起作用
【讨论】:
太棒了。我否定了向量,它工作得很好。它只是表现得很奇怪,显然是不正确的,积极的价值观。感谢发帖。以上是关于根据 3D 对象的位置旋转相机的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV(C ++) - 根据已知的3D对象和摄像机位置计算图像的2D坐标