【问题标题】:Quaternion correction四元数校正
【发布时间】:2018-05-11 11:24:17
【问题描述】:

我正在尝试为客户端模拟刚体实施网络校正。每秒 30 次我得到目标旋转,我从中计算旋转校正。然后我在多个帧上应用此校正。

网络更新:

rotationCorrection = receivedRotation * Quaternion.Inverse(transform.rotation);

每一帧:

var a = Mathf.Min(1, Time.deltaTime * 8);

var final = Quaternion.Slerp(transform.rotation, transform.rotation * rotationCorrection, a);
var actualCorrection = final * Quaternion.Inverse(transform.rotation);
rotationCorrection *= Quaternion.Inverse(actualCorrection);
//rotationCorrection = Quaternion.Slerp(rotationCorrection, Quaternion.identity, a); // First try

_rigidbody.MoveRotation(final);

我不只是将当前旋转插值到更正的原因是游戏对象包含一个刚体,除了更正之外,它还应该模拟对象。

这有时确实有效(至少是第一次尝试版本),除了大约 -90 到 90 之间的角度。我怀疑它的代码将旋转校正转换为身份。

【问题讨论】:

    标签: unity3d math


    【解决方案1】:

    (由于问题不是 100% 明确,因此正在进行中)

    减法公式产生错误的结果。请尝试使用欧拉,减去角度,您可以得到所需的四元数。

    您确定不需要 Lerp 而不是 Slerp?

    无论如何 final 不应该使用 Lerp 或 Slerp。

    如果final 你想要transform.rotation * rotationCorrection(即当前旋转加上修正),那么就照这样使用它。乘法实际上添加了旋转。

    Lerp 和 Slerp 将与a 参数一起用于时间,其中 a==0 将返回起始旋转,a==1 将返回最终旋转。所以a 应该随时间缩放。另一方面,如果网络校正正是您所需要的,并且您在特定的固定时间更新中得到它,那么没有任何 Lerp,不妨试试transform.rotation = transform.rotation*rotationCorrection

    rotationCorrection = receivedRotation * Quaternion.Inverse(transform.rotation);
    

    它的作用是返回一个从 receivedRotation 开始到当前变换旋转的相反旋转结束的旋转。所以起点和终点都不匹配当前的。

    所以:

    您将最终的四元数设置为 currentRot * change

    从 currentRot 开始

    然后通过使其 = (S)Lerp 来更新 transform.rotation,其中 start、end 和一个参数在开始时间等于 0,在结束时间等于 1。

    【讨论】:

    • 感谢您的回复。我不希望客户端对象只是捕捉到正确的位置。相反,我想随着时间的推移应用部分校正。 a 实际上是 Time.deltaTime(我编辑了帖子)。
    • 我更新了我的答案....不要最终确定,但按照我的建议去做,它会起作用:)
    • 我更新了问题。只是 (S)lerping 不会很遗憾,因为 Rigidbody 仍然应该完成它的工作。所以 lerp 目标(transform.rotation * rotationCorrection)是无效的。
    • 嗯,明白了!
    • 好吧,不... :) 这个表达式的作用非常不同。你能完全避免减法的需要,只让“校正器”给你想要的校正吗?这样你就已经拥有了。否则使用欧拉并减去角度,ti 将起作用。我会把它添加到我的答案中
    【解决方案2】:

    网络更新错误。更正:

    rotationCorrection = Quaternion.Inverse(transform.rotation) * receivedRotation;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      相关资源
      最近更新 更多