【问题标题】:GLSL: rotation with a rotation vector?GLSL:用旋转矢量旋转?
【发布时间】:2017-12-21 02:20:10
【问题描述】:

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

【问题讨论】:

  • 你不知道怎么办?您可以将值作为 6 个浮点数或 2 个 vec3s 传递。你的意思是你不知道如何使用这些值计算所有操作的组合矩阵?另外,您确定寄存器中的单个 4x4 矩阵真的是空间问题吗?我想为每个顶点或像素计算 4x4 矩阵将是处理器密集型的。这是您想要做出的权衡吗?
  • 它不是单个 4x4 矩阵,而是每个骨骼的 4x4 矩阵。我不知道如何使用我拥有的旋转 vec3 旋转一个点。

标签: c opengl glsl


【解决方案1】:

我不知道如何使用我拥有的旋转 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 矩阵。然后,毕竟,你仍然必须做实际的矩阵乘法来旋转向量。

【讨论】:

  • 什么会更有效率?使用四元数还是在着色器中构造旋转矩阵?
  • 不应该vec3 rotated = v + 2.0*cross(q.xyz, temp); 更高效(避免 1 DOT 和 1 MAD)?虽然不确定这是否需要单位 quat 而你的不需要(但话说回来,谁使用非单位 quat 进行轮换?)。
  • 你说sincos是重量级的。但是,我在网上看到一些人说它们在许多 GPU 上只是一个时钟周期。你能指出任何关于它们速度慢的证据吗?
  • @v.shashenko:我看到网上的人说了很多话。你有任何实际的链接吗?另外,请注意,即使这些 vector-wise sin/cos 操作中的每一个都是一个循环,也没有考虑使用它们构建矩阵然后执行矩阵的成本相乘。
  • @NicolBolas:此类链接之一stackoverflow.com/a/11823383/1894053
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
相关资源
最近更新 更多