根据 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 对象的位置旋转相机的主要内容,如果未能解决你的问题,请参考以下文章

在 3D 中反转旋转,使对象始终面向相机?

OpenCV(C ++) - 根据已知的3D对象和摄像机位置计算图像的2D坐标

如何为在播放模式下实例化并在 Unity 3d 中使用相机位置重新创建的对象添加视差

Java OpenGL - 如何使对象随相机旋转?

Unity:使用鼠标位置为我的相机制作角度以围绕对象旋转

在 OpenCV 中检测对象然后计算对象/相机的位姿