我试图找出如何将旋转以多个增量方式应用于一个动态的方向(也就是说,我不能使用slerp)。
Details: I在3D空间中有一个对象,其方向可以用四元数Q来描述。当这个对象旋转时,它接收来自另一个服务器的定期更新,该服务器定义了真正的方向。例如,在t1中,对象的方向是Q1,并收到了正确的方向应该是K1的更新。
我不能简单地将Q1替换为K1,因为视觉结果不会很顺利,所以我宁愿从Q1逐步修正到K1,连续执行10步。另外,我不能使用slerp,因为Q1不是静态的。相反,在下一个服务器更新到来之前,我想派生一个增量校正,我称之为dK。
现在,我以以下方式导出dK:
delK = K1 * Q1.conjugate()dk = delK / 10实际上,在第2步中,我将delK转换为axis+angle代表,然后将角度除以10,然后转换回四元数。
问题1:在数学上是正确的吗?
问题2:,我看到的情况是,dk不是一个小的修正,可能是向相反的方向旋转。是什么导致了这一切。
这是为了在JavaScript 仁川中实现客户端预测。
发布于 2018-10-21 16:24:42
您可以将您的10步方法替换为"slerp“解决方案:
Q = slerp(Q, Q1, 1 - Math.pow(smoothingRatio, deltaTime)这个解决方案将以一种与帧速率无关的方式使Q向Q1倾斜,并且允许Q1是动态的。经过1秒的插值,到Q1的“距离”的剩余部分将是smoothingRatio。阅读更多的这里。
如果每次更新的旋转度大于180度,则最近的旋转轴将与服务器上的旋转轴不同。一个简单的解决方案是更频繁地发送更新,或者限制对象的旋转速度。
如果您要在更新的同时发送角速度,您可以做更好的客户端预测,并可能绕过“相反的方向”问题。我们的想法是保持四元数沿着上次更新中发送的角速度旋转。
Quaternion#integrate函数在Cannon.js中实现四元数集成,您可以使用它。
// Rotate Q along the angular velocity provided in the last update
Q = Q.integrate(angularVelocity, deltaTime, Vec3.ZERO);https://stackoverflow.com/questions/42582683
复制相似问题