执行旋转的旋转轴



有一个第一人称相机朝d方向看。

为了让相机指向目标t(具有相关的方向d2),我必须绕某个轴旋转d,对吗?这个轴应该穿过相机,应该垂直于d和d2形成的平面,对吧?

假设我每帧将向量d旋转一定程度,旋转轴不应该改变,因为尽管d慢慢接近d2,但它们对应的平面不会改变,对吧?

如果这都是真的,那么我想知道为什么下例中的旋转轴在每次调用时都会发生变化。旋转工作准确,但从旋转开始到旋转结束,速度会降低。

这篇文章来自当前问题的上下文,在这里您还可以看到源代码。

_rotationAxis指向的方向不变,因此状态下的旋转方向是恒定且正确的。但_rotationAxis的大小正在变化,因此x、y、z分量的值不同,旋转量也不同。

执行交叉以获得旋转轴时,生成的向量的长度是交叉的两个向量的长度的函数AND分隔它们的角度。结果向量的方向总是与两个输入向量都成90度。

最有可能的是,您使用的2个向量的长度是一致的,并且最有可能是单位长度,但由于它们之间的角度每帧都较小,因此每帧_rotationAxis的长度不同。

在Xna中,CreateFromAxisAngle产生的旋转量不仅取决于作为参数插入的角度,还取决于轴向量的长度(在文档中不明显,但确实如此)。因此,每帧使用的旋转轴越来越短,这会导致每帧的旋转量越来越小。只有当旋转轴矢量的长度为1.0(单位长度矢量)时,才会产生插入的旋转角度。

CreateFromAxisAngle中使用_rotationAxis之前,必须将其规格化为单位长度。

_rotationAxis = Vector3.Cross(Direction, _flyTargetDirection);
_rotationAxis.Normalize();
_rotation = Matrix.CreateFromAxisAngle(_rotationAxis, MathHelper.ToRadians(_flyViewingSpeed - Math.ToRadians(rotationSpeed)));

最新更新