我正在尝试为客户端模拟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转移到标识。
答案 0 :(得分:0)
网络更新错误。校正:
rotationCorrection = Quaternion.Inverse(transform.rotation) * receivedRotation;