四元数修正

时间:2018-05-11 11:24:18

标签: unity3d math

我正在尝试为客户端模拟Rigidbody实施网络修正。每秒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);

我不仅仅将当前旋转插入校正后的原因是GameObject包含一个Rigidbody,除了校正之外还应该模拟对象。

这有时会起作用(至少是第一次尝试版本),除了大约-90到90之间的角度。我怀疑它的代码是将rotationCorrection转移到标识。

1 个答案:

答案 0 :(得分:0)

网络更新错误。校正:

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