世界速度到当地(船可能向后飞,所以需要世界负速度等)

时间:2013-06-30 04:08:28

标签: c# 3d xna rotation

标题几乎说了这一切..说我有一艘船,它的worldVelocity是一个带有这些值的Vector3: X:0 Y:0 Z:1 (假设+ Z为正向,+ Y为向上,+ X为向右) 这个Vector3被添加到船舶worldTranslations Matrix中,它存储了平移和旋转。

worldTranslations.Translation + = worldVelocity

我的船向前行进,它以速度1(正确)停止加速,因为这是它的目标速度,但是如果船已经旋转了180度,那么它现在向后飞行。船舶目标速度自动检测到这一点并开始尝试再次向前飞行。

问题是我不知道如何从我的船速和localTransforms中获取当地速度,我无法在任何地方找到答案..

所以此刻我的船使用世界速度来检查它是否达到目标速度,只要船没有旋转,它就会正常飞行。我的目标速度是1,所以我的船比较它的当前速度(0,0,0)和目标速度(0,0,1)并正确加速直到达到目标(0,0,1)并停止加速到保持恒定的速度,但是如果我转弯(比如说只有90度),当前的速度现在是(-1,0,0)因为船现在正在向左漂移,所以它应该使用相对速度来确定它需要加速(1,0,1)回到(0,0,1)但我不知道如何获得相对速度所以它目前使用的世界速度仍为(0,0,1),即使它向左飞行所以它认为这一切都很好,但它还在漂流......

再次感谢所有人:)

2 个答案:

答案 0 :(得分:1)

答案是通过逆旋转矩阵变换速度矢量。

这篇文章的制作是因为我的朋友意识到Unity3D使用其内置函数实现了所需的结果,但最终是同样的问题:

XNA equivalency of unity function Transform.InverseTransformDirection

可以在该页面上找到更详细的说明。

但是,如果这对您不起作用,因为它没有立即解决我的问题,请尝试一次检查向量的一个组件。我不得不将向量的Z分量乘以-1才能使其工作。很可能是其他数学的干扰所以我建议你分别检查结果向量组件结果。

-Aaron

答案 1 :(得分:0)

该船的世界矩阵有一个'前进'属性是一个单位长度矢量,总是指向船舶的前进方向。每当船舶的轮换更改并更新世界矩阵以存储更改时,此向量都会更新。

因此,您可以关闭该矢量的速度,它将始终相对于船的旋转向前移动。

Velocity = shipMatrix.Forward * speed;
ShipMatrix.Translation += velocity;