GLSL:用旋转矢量旋转?

时间:2012-01-27 17:04:22

标签: c opengl glsl

我正在尝试使用GLSL进行骨骼动画。对于每个骨骼,我有一个平移(x,y,z)和一个旋转(俯仰,滚动,偏航)(以度为单位)。我可以为每个骨骼构建一个4x4矩阵,但这会在着色器中占用大量的寄存器空间,所以我只想存储每个骨骼的6个值,但我不知道如何做到这一点。 / p>

1 个答案:

答案 0 :(得分:2)

  

我不知道怎么做是如何使用旋转vec3旋转一个点。

简单:不要。

Yaw-pitch-roll是一种编码方向的可怕方式,尤其适用于动画系统。请改用四元数。它是4个值而不是3个,旋转代码是众所周知的。

此外,它不需要像sincos这样的重量级操作。

如果您想比较和对比所需的努力,请考虑数学。

给定四元数q,位置v,您需要执行此操作来旋转它:

vec3 temp = cross(q.xyz, v) + q.w * v;
vec3 rotated = v + 2.0*cross(q.xyz, temp);

这是一个相当的数学。现在,考虑一下你在YPR案件中需要做些什么,给出:

vec3 cosYPR = cos(ypr);
vec3 sinYPR = sin(ypr);

这不是一切。但那足够。这是三个cos和三个sin操作。这些是不是快速的操作。仅这一点可能需要与整个四元数/向量旋转计算一样长。但是在执行此操作之后,您现在必须进行多次乘法并添加以计算3x3矩阵。然后,毕竟,仍然必须进行实际矩阵乘法以旋转矢量。