- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经(有点盲目地)在物理刚体模拟中使用四元数进行旋转有一段时间了,但最近开始对四元数旋转的通常定义方式以及我如何做到这一点感到困惑(基于游戏开发者的物理一书) .
在书中,您有一个角速度 angVel 和一个时间步长 dt 以及一个初始方向。
步骤如下
方向 += 0.5*方向*角度速度 * dt
其中四元数向量乘法是通过首先将向量 xyz 转换为四元数 xyz,0 来完成的
这是可行的,但在其他地方,过程都是创建一个四元数,它定义了时间积分 angVel,在 dt 上,然后将其乘以方向。它本质上将 angVel*dt 转换为旋转(这很有意义),然后通过乘法将其应用于原始方向,如此处所示,具有更好的语法 https://math.stackexchange.com/questions/39553/how-do-i-apply-an-angular-velocity-vector3-to-a-unit-quaternion-orientation
我的问题是上面的 0.5 * 四元数 * 矢量 * 标量在概念上是什么,以及将这个结果四元数添加到我的方向是什么,考虑到您通常会乘法,并且不是添加,而是旋转。
最佳答案
为了正确地结束这个问题,我将在这里扩展minorlogic的评论。
旋转四元数 q 对角速度 v 的时间导数为
dq/dt = 0.5*q*v
这里 v 是定义角速度,其形式为矢量方向定义旋转轴,大小定义旋转速度。 v 进一步在“局部空间”中给出。如果 v 位于“世界空间”,则 q 和 v 的乘法顺序将相反。
然后是问题表达
orientation += 0.5*orientation*angVel * dt
事实证明,这只是使用该时间导数随时间进行的正常一阶积分。然而,它不是很准确,并且需要方向四元数不断重新归一化,但它简单、快速,并且不像轴角转换那样使用 sin 或 cos 。
精度问题和归一化要求可以通过查看单位四元数来解释,正确的旋转必须是单位四元数,作为位于 4d 球体上的点,并将导数作为垂直于该球体表面的向量。很明显,如果您简单地将这样的向量添加到表面上的这样一个点,您就会得到一个新点,该点不再位于表面上,而是稍高于表面。轻微程度取决于该向量的大小以及乘以导数向量的时间步长。然后需要标准化才能将其放回表面。
明确回答问题。当您有一个方向和一个已知的旋转四元数来旋转它时,使用乘法方法,而加法方法则试图通过导数的一阶积分来达到相同的目标。
关于rotation - 将角速度积分为四元数旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46908345/
我的游戏有点问题。我试图让一个球从一个点移动到另一个点。这是我的代码: void Create() { // Initialise points StartPosition - { 2
我是一名优秀的程序员,十分优秀!