gpt4 book ai didi

c++ - 根据 3D 对象的位置旋转相机

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:10 24 4
gpt4 key购买 nike

我使用 Opengl 作为小型汽车模拟的基础。

我进口了一辆模型车,它开得很好,相机也跟着它。不幸的是,当汽车转弯时,我似乎无法让相机的位置移动(或留在汽车后面)。它只是原地旋转。

例如,如果汽车向左转,摄像头会旋转以跟随它,但不会移动到汽车的正后方。

我看过这些问题herehere但似乎仍然无法正常工作。

这就是我计算汽车位置的方式(它现在只是在 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)

enter image description here

在我看来,它应该是:

    camX + globalPos.x+ sin(rotX_rad)*(distFromCar),
camY,
camZ + globalPos.z- cos(rotX_rad)*(distFromCar),

但它的行为很奇怪......

我没有做什么?

最佳答案

试一试,这在我的脑海中是有道理的,但在现实中可能不是这样:)

好的,所以我们可以将您汽车的位置和速度表示为二元 vector (在位置的情况下它是一个点,在速度的情况下它是一个真正的 vector 。)

现在我们已经知道了,为了计算相机的位置,我们可以取速度 vector 的负值(这意味着只需使 vector 的所有元素都为负,产生一个大小相同但方向完全相反的 vector )并将该 vector 添加到您汽车的位置。

例如,假设您的汽车位于 (1,1) 位置,您的速度 vector 为 (1,2)。负速度 vector 为 (-1,-2),相机的位置为 (1,1) + (-1,-2) 为 (0,-1)。您可能希望对负速度 vector 进行归一化,以便您的相机与汽车保持恒定距离,否则您走得越快,相机就会越远:)

现在您已经有了相机的位置,只需调用 gluLookAt:

gluLookAt(camPos.x,camPos.y,camPos.z,carPos.x,carPos.y,carPos.z,0,1,0);

如您所见,我们传递了相机的位置(我们刚刚在上一步中计算出的)并告诉相机看向汽车。你可能想要调整一些值(例如,让相机漂浮在离地面几个单位的地方,而不是直接在汽车后面,或者让相机看向汽车上方几个单位的点,等等)

让我知道这是怎么回事!再一次,这只是我认为可能对你有用的东西,虽然不能保证我的数学是正确的:)但这应该比摆弄角度等更快更容易理解。要记住的一件事:如果汽车完全静止(没有速度 vector ),这将不起作用

关于c++ - 根据 3D 对象的位置旋转相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22866742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com