旋转轴执行旋转

时间:2012-10-09 10:16:29

标签: c# vector xna rotation

让第一人称相机观察方向d。

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

假设我每帧旋转矢量d一定程度,旋转轴不应该改变,因为虽然d慢慢接近d2,但它们相应的平面不会改变,对吗?

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

此帖子来自current question here的上下文,您还可以在其中查看源代码。

1 个答案:

答案 0 :(得分:0)

_rotationAxis指向的方向不会改变旋转方向,因为状态是恒定且正确的。但_rotationAxis的幅度正在发生变化,因此您可以获得x,y,z分量和不同旋转量的不同值。

当您执行十字形以获得旋转轴时,结果矢量的长度是两个矢量的长度的函数 AND 角度将它们分开。所得矢量的方向始终与两个输入矢量成90度。

最有可能的是,您使用的2个矢量的长度是一致的,并且最相似的单位长度,但由于它们之间的角度减去每个帧,因此每帧的_rotationAxis会产生不同的长度。

在Xna中,由CreateFromAxisAngle产生的最终旋转量不仅取决于您插入的角度作为参数,还取决于轴向量的长度(在文档中不明显,但是真的没有越少)。因此,每帧使用更短和更短的旋转轴,这导致每帧的旋转量越来越小。如果旋转轴矢量的长度为1.0(单位长度矢量),它只会产生插入的旋转角度。

_rotationAxis中使用CreateFromAxisAngle之前,您必须将_rotationAxis = Vector3.Cross(Direction, _flyTargetDirection); _rotationAxis.Normalize(); _rotation = Matrix.CreateFromAxisAngle(_rotationAxis, MathHelper.ToRadians(_flyViewingSpeed - Math.ToRadians(rotationSpeed))); 标准化为单位长度。

{{1}}