GLSL:用旋转矢量旋转?

问题描述 投票:2回答:1

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

c opengl glsl
1个回答
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矩阵。然后,经过所有这些,你仍然需要实际矩阵乘以旋转矢量。

© www.soinside.com 2019 - 2024. All rights reserved.