【问题标题】:Rotating one vector to face another but slowly?旋转一个矢量以面对另一个但缓慢?
【发布时间】:2011-10-31 11:56:40
【问题描述】:

我有两个向量:headingtarget。如何通过某些因素将航向转向面对目标?每帧说 10% 什么的。

社区编辑: target 向量在不断变化。

谢谢!

【问题讨论】:

  • 这个问题太模糊了。您想以恒定角速率(例如每秒一度)还是以其他方式转动?你的航向幅度有什么意义吗?等

标签: math language-agnostic vector rotation


【解决方案1】:

假设唯一重要的是headingtargetHeading 的方向,我们将假设所有向量都是标准化的。你也说过你希望这是真的:

dheadingDegrees/dt = angle(targetHeading,heading) degrees/sec in the direction of targetHeading

(至少我是这样解释的,而不是“每帧接近 10% 但从未到达目的地”)

要获得准确的答案,您需要积分和一些数学运算。如果你想模拟它并得到一个精确的答案,你可能想把它从“帧”中解耦出来,并可能每秒模拟 100 个间隔,具体取决于所需的精度。

因此:

every time interval dt:
 target = getCurrentTarget()
 rotationSpeed = angleBetween(target,currentHeading)/(1second)
 heading = {rotate heading by dt*rotationSpeed radians towards target}
            ^-------- for how to do this, see below ----------------^

to rotate a vector v1 to v2 from time t=0 to t=1, with constant angular velocity:
 v1normalized = normalized(v1)
 v2perpNormalized = normalized(v2 - v2*v1normalized)
 animated = cos(t*pi/2)*v1normalized + sin(t*pi/2)*v2perpNormalized

【讨论】:

    【解决方案2】:

    使用点积求两个向量之间的角度:

    heading . target = |heading|*|target|*cos(theta)
    

    然后每一帧,使用旋转矩阵将heading 旋转0.10*theta

    【讨论】:

    • 这假设你有某种旋转矩阵。在 2D 中,这是一个定义明确的操作,但在 3D 中,它变得不明确。
    • 它在 3D 中被完美地定义为“沿旋转轴旋转 theta 的矩阵”。
    • 你如何选择具体的旋转轴?我记得最近试图解决这个确切的问题,但我不记得解决方案是什么。 (顺便说一句,我可能不应该在凌晨 3 点尝试做数学)
    • 对于 3D,可以使用航向和目标之间的叉积来选择旋转轴(a x b 将是与ab 正交的某个向量)
    猜你喜欢
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    相关资源
    最近更新 更多