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

本文关键字:世界 速度 | 更新日期: 2023-09-27 18:20:30

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

worldTranslations.Translation+=worldVelocity

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

问题是我不知道如何从我的船速度和localTransforms中获得局部速度,而且我在任何地方都找不到答案。。

因此,目前我的飞船使用世界速度来检查它是否达到了目标速度,只要飞船不旋转,它就能正常飞行。我的目标速度是1,所以我的船将其当前速度(0,0,0)与目标速度(0,0,1,所以它应该使用这个相对速度来确定它需要加速(1,0,1)才能回到(0,0,1),但我不知道如何获得相对速度,所以它目前使用的世界速度仍然是(0,00,1),尽管它向左飞行,所以它认为一切都很好,但它仍然向左漂移。。

谢谢。。再次提醒大家:)

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

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

这篇帖子是在我的朋友意识到Unity3D使用其内置功能实现了预期结果时发布的,但最终是同一个问题:

单位函数Transform.InvrseTransformDirection 的XNA等价性

更详细的解释可以在该页面上找到。

然而,如果这对你不起作用,因为它没有立即解决我的问题,试着一次检查向量的一个分量。我只需要把向量的Z分量乘以-1就可以了。很可能受到其他数学的干扰,所以我建议您单独检查结果向量分量结果。

-Aaron

船舶的世界矩阵具有"Forward"属性,该属性是始终指向船舶前进方向的单位长度向量。该向量在船舶旋转发生变化时随时更新,并更新世界矩阵以存储变化。

因此,你可以将速度设定为偏离该向量的关键点,它将始终相对于船的旋转向前移动。

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