使用 aTan2 将对象面向其目标

Using aTan2 to face an object to its destination

本文关键字:目标 对象 aTan2 使用      更新时间:2023-10-16

我创建了一个以惯性向目的地移动的对象。我在让物体面对目的地时遇到了很多麻烦。我的代码很简单,它计算角度,将其转换为度数并将该角度传递给 Matrix4 旋转函数,该函数调整 localTransform(场景图)。

问题是对象生成,然后无休止地旋转。它慢慢地向目标前进,但只是继续旋转。我已经在没有翻译的情况下对其进行了测试,无论现场如何,它都会旋转。我所需要的只是让物体面对它的目的地。我的平移/旋转函数工作正常,我用它来旋转对象,让对象在其父对象的旋转下生成并朝那个方向前进。它们通过 GLM 库提供 1:1 的结果。

我尝试在 aTan2 中交换顺序,删除度数转换(尽管这什么也不做,旋转函数需要度数)并交换平移/旋转顺序。

localTransform 是组合的旋转/缩放/平移矩阵。 row[3]列[1] 是 Y。 [3][0] 是 X。

float fAngle = atan2(v3Destination[1] - localTransform.data[3][1] , v3Destination[0] - localTransform.data[3][0]);
float fAngleDegrees = fAngle * 180 / PI;
localTransform = Matrix4::Rotate(localTransform, fAngleDegrees, Vector3(0.0f, 0.0f, 1.0f));
Vector3 Movement;
Movement[0] = v3Destination[0] - localTransform.data[3][0];
Movement[1] = v3Destination[1] - localTransform.data[3][1];
Movement = Movement * fSpeed * Application.GetTimeStep();
localTransform = Matrix4::Translate(localTransform, Movement);

关于如何处理这个问题的任何建议?这一切都在 2D 坐标中,但是旋转是在 Z 轴上完成的。

只是一种预感,但是每个时间步长都完全重新计算了localTransform矩阵吗?

或者,您可以向在上一次迭代中已经旋转的矩阵添加旋转。

这可以解释连续旋转。