首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >四元数的增量应用

四元数的增量应用
EN

Stack Overflow用户
提问于 2017-03-03 15:25:47
回答 1查看 668关注 0票数 1

我试图找出如何将旋转以多个增量方式应用于一个动态的方向(也就是说,我不能使用slerp)。

Details: I在3D空间中有一个对象,其方向可以用四元数Q来描述。当这个对象旋转时,它接收来自另一个服务器的定期更新,该服务器定义了真正的方向。例如,在t1中,对象的方向是Q1,并收到了正确的方向应该是K1的更新。

我不能简单地将Q1替换为K1,因为视觉结果不会很顺利,所以我宁愿从Q1逐步修正到K1,连续执行10步。另外,我不能使用slerp,因为Q1不是静态的。相反,在下一个服务器更新到来之前,我想派生一个增量校正,我称之为dK

现在,我以以下方式导出dK

  1. delK = K1 * Q1.conjugate()
  2. dk = delK / 10

实际上,在第2步中,我将delK转换为axis+angle代表,然后将角度除以10,然后转换回四元数。

问题1:在数学上是正确的吗?

问题2:,我看到的情况是,dk不是一个小的修正,可能是向相反的方向旋转。是什么导致了这一切。

这是为了在JavaScript 仁川中实现客户端预测。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-21 16:24:42

您可以将您的10步方法替换为"slerp“解决方案:

代码语言:javascript
运行
复制
Q = slerp(Q, Q1, 1 - Math.pow(smoothingRatio, deltaTime)

这个解决方案将以一种与帧速率无关的方式使Q向Q1倾斜,并且允许Q1是动态的。经过1秒的插值,到Q1的“距离”的剩余部分将是smoothingRatio。阅读更多的这里

如果每次更新的旋转度大于180度,则最近的旋转轴将与服务器上的旋转轴不同。一个简单的解决方案是更频繁地发送更新,或者限制对象的旋转速度。

如果您要在更新的同时发送角速度,您可以做更好的客户端预测,并可能绕过“相反的方向”问题。我们的想法是保持四元数沿着上次更新中发送的角速度旋转。

Quaternion#integrate函数在Cannon.js中实现四元数集成,您可以使用它。

代码语言:javascript
运行
复制
// Rotate Q along the angular velocity provided in the last update
Q = Q.integrate(angularVelocity, deltaTime, Vec3.ZERO);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42582683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档