【问题标题】:world velocity to local (ship might be flying backward so need worlds negative velocity etc.)世界速度到本地(船可能向后飞行,所以需要世界负速度等)
【发布时间】:2013-06-30 04:08:27
【问题描述】:

标题几乎说明了一切.. 假设我有一艘船,它的 worldVelocity 是具有以下值的 Vector3: X: 0 是: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),即使它向左飞行所以它认为一切都很好,但它仍然在向左漂移..

谢谢..再次感谢大家:)

【问题讨论】:

  • 将世界向量乘以逆局部矩阵怎么样?
  • 它在做一些有趣的事情:/ 很难描述,但基本上这艘船开始向前移动,以非常小的速度它似乎可以适当地适应旋转,但也会绕圈子...... . 再快一点,它就会像疯了一样从中心盘旋而去 O.o
  • 我已经修复了,你的想法是正确的。但是由于某种原因,我不得不只将结果向量的 Z 分量乘以 -1。我不明白为什么,也许它与其他数学有关,我做错了,但现在终于修好了。谢谢:)

标签: c# 3d xna rotation


【解决方案1】:

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

这篇文章是因为我的朋友意识到在 Unity3D 中使用其内置函数之一实现了预期的结果,但最终是同一个问题:

XNA equivalency of unity function Transform.InverseTransformDirection

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

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

-亚伦

【讨论】:

    【解决方案2】:

    船的世界矩阵有一个“前进”属性,它是一个单位长度的向量,总是指向船的前进方向。每当船的旋转发生变化时,这个向量就会更新,世界矩阵也会更新以存储变化。

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

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

    【讨论】:

    • 对不起,这个答案我已经看过很多次了。我不是从旋转中检索前向矢量,而是速度方向矢量。如果我侧身漂流怎么办?我的船应该会自动调整(实际上考虑到惯性),所以我需要知道它的滑动方式。如果我在侧向漂移,我不仅想向前施加加速度,而且还想向我的权利施加加速度以补偿侧向漂移。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多