Math 结合具有不同轴心点的四元数 背景:

Math 结合具有不同轴心点的四元数 背景:,math,translation,glsl,quaternions,vertex-shader,Math,Translation,Glsl,Quaternions,Vertex Shader,我目前正在GLSL中实现骨骼动画着色器,为了节省空间和复杂性,我使用四元数进行骨骼旋转,使用加权四元数乘法(每个骨骼)为每个顶点累积“最终旋转” 类似:(伪代码,假设四元数数学按预期工作) 浮动权重[5]; int-bones[5]; vec4位; 均匀四元数全微分[100]; 均匀vec3全骨定位[100]; main(){ 四元数最终四元数; 对于(i=0;i事实上,四元数的位置分量是不存在的,因此需要单独跟踪它 x' = R(q)*(x-pivot)+pivot = R(q)*x + (p

我目前正在GLSL中实现骨骼动画着色器,为了节省空间和复杂性,我使用四元数进行骨骼旋转,使用加权四元数乘法(每个骨骼)为每个顶点累积“最终旋转”

类似:(伪代码,假设四元数数学按预期工作)

浮动权重[5];
int-bones[5];
vec4位;
均匀四元数全微分[100];
均匀vec3全骨定位[100];
main(){
四元数最终四元数;

对于(i=0;i事实上,四元数的位置分量是不存在的,因此需要单独跟踪它

x' = R(q)*(x-pivot)+pivot = R(q)*x + (pivot-R(q)*pivot) = R(q)*x+p,
其中,
q
是你的四元数,
R(q)
是由它构建的旋转矩阵,
p=pivot-R(q)*pivot
是位置/平移分量。如果你想组合两个这样的变换,你可以不用进行全矩阵乘法:

x'' = R(q2)*x'+p2 = R(q2)*R(q)*x + (R(q2)*p+p2) = R(q2*q)*x + (R(q2)*p+p2).
这样,组合的四元数将是
q2*q
,组合的位置是
R(q2)*p+p2
。请注意,如果要完全避免,您甚至可以将四元数应用于向量(
R(q2)*p
等),而无需显式构建旋转矩阵


也就是说,还有一个“双四元数”的概念,它实际上包含一个平移分量,并且可能更适合表示螺旋运动.

经过大量的额外搜索,阅读了比任何正常人都多的关于四元数的内容,我终于在这里找到了我的答案:

事实证明,双四元数的运算方式与实际四元数类似,许多数学运算基于常规四元数数学,但它们同时提供方向和位移,并且可以组合用于所需的任何旋转-平移序列,非常类似于变换矩阵乘法,但没有剪切/平移能力


该页面还有一个部分,它精确地导出了“围绕任意点旋转”我使用双四元数乘法所需的功能。也许我在提问之前应该多研究一下,但至少现在答案就在这里,以防其他人来看。

在粗略浏览了您的问题之后,第一个(可能是最好的)我想到的答案是:使用双四元数!。它们很容易使用(一旦你了解了概念),很容易转换为刚体矩阵或从刚体矩阵转换而来,并且在性能上与矩阵类似(如果使用正确,不要在着色器中进行矩阵转换)。谷歌搜索“双四元数蒙皮”应该会带你去Ladislav Kavan的网站和论文,这些网站和论文大致描述了它们的用法。非常感谢!在多搜索几个小时后,我最终发现了双四元数,但没有注意到Ladislav Kavan的网站。不过这似乎非常有帮助,谢谢!
x'' = R(q2)*x'+p2 = R(q2)*R(q)*x + (R(q2)*p+p2) = R(q2*q)*x + (R(q2)*p+p2).