Javascript 四元数的增量应用
我想知道如何以多个增量进行旋转, 指向动态方向(即,我不能使用slerp) 详细信息: 我有一个三维空间中的对象,它的方向可以用四元数Javascript 四元数的增量应用,javascript,three.js,game-engine,quaternions,cannon.js,Javascript,Three.js,Game Engine,Quaternions,Cannon.js,我想知道如何以多个增量进行旋转, 指向动态方向(即,我不能使用slerp) 详细信息: 我有一个三维空间中的对象,它的方向可以用四元数Q来描述。 当此对象旋转时,它会从另一台服务器接收定期更新, 它定义了真实的方向。例如,在时间t1,对象的方向 wasQ1,并收到更新,正确方向应为K1 我不能简单地用K1替换Q1,因为视觉效果会不平滑, 因此,我宁愿通过10个步骤从Q1逐步纠正到K1。 另外,我不能使用slerp,因为Q1不是静态的。相反,我想 在下一次服务器更新之前,派生一个增量修正,我称之为
Q
来描述。
当此对象旋转时,它会从另一台服务器接收定期更新,
它定义了真实的方向。例如,在时间t1
,对象的方向
wasQ1
,并收到更新,正确方向应为K1
我不能简单地用K1
替换Q1
,因为视觉效果会不平滑,
因此,我宁愿通过10个步骤从Q1
逐步纠正到K1
。
另外,我不能使用slerp,因为Q1
不是静态的。相反,我想
在下一次服务器更新之前,派生一个增量修正,我称之为dK
到了
现在,我通过以下方式导出dK
:
delK=K1*Q1.conjugate()
dk=delK/10
delK
转换为轴+角度表示,
然后将角度除以10。然后我转换回四元数
问题1:上述方法在数学上正确吗
问题2:我看到的情况是,dk
不是一个小的修正,可能会朝相反的方向旋转。这可能是什么原因造成的
这是为了在JavaScript中实现客户端预测。您可以用“slerp朝向”解决方案取代您的10步方法:
Q = slerp(Q, Q1, 1 - Math.pow(smoothingRatio, deltaTime)
该解决方案将以与帧速率无关的方式将Q向Q1倾斜,并允许Q1是动态的。插值1秒后,到Q1的“距离”的剩余部分将是smoothingRatio
。阅读更多
如果每次更新的旋转角度大于180度,则最近的旋转轴将不同于服务器上的旋转轴。一个简单的解决方案是更频繁地发送更新,或者限制对象的旋转速度
如果将角速度与更新一起发送,则可以更好地进行客户端预测,并可能绕过“反向”问题。这个想法是沿着上次更新中发送的角速度继续旋转四元数
Cannon.js中的函数实现了四元数集成,您可以使用它
// Rotate Q along the angular velocity provided in the last update
Q = Q.integrate(angularVelocity, deltaTime, Vec3.ZERO);
在当前位置Q1和目标旋转K1之间使用具有预定义权重的Slerp。我认为您只需要一个动画来平滑方向更新。试试anime.js怎么样?