【问题标题】:Rotate a Unit Vector by a Given Quaternion通过给定的四元数旋转单位向量
【发布时间】:2014-02-02 19:47:51
【问题描述】:

我正在尝试计算指向我的 opengl 相机的单位向量。给定一个旋转四元数 (w,x,y,z),我将如何计算单位向量围绕该四元数的旋转?

在这种情况下,单位向量可以限制为(0,0,-1)。

编辑:最终解决方案

对于 (0,0,1) 的旋转:

vec.x=2*x*z - 2*y*w;
vec.y=2*y*z + 2*x*w;
vec.z=1 - 2*x*x - 2*y*y;

请注意,矩阵需要转置才能与 OpenGL 一起使用。

【问题讨论】:

标签: java opengl math rotation quaternions


【解决方案1】:

将四元数转换为 3x3 旋转矩阵并将该旋转应用于您的向量。

对于一个单位(w, x, y, z)四元数,这个矩阵是:

      ( 1 - 2 * ( y * y + z * z )      2 * ( x * y - z * w )      2 * (x * z + y * w ) )
  R = (     2 * ( x * y + z * w )  1 - 2 * ( x * x + z * z )      2 * (y * z - x * w ) )
      (     2 * ( x * z - y * w )      2 * ( y * z + x * w )  1 - 2 * (x * x + y * y ) )

如果你的向量有(0, 0, -1)这样简单的形式,你不需要计算旋转矩阵的所有9个系数,因为矩阵向量乘法的结果只使用了一些系数(@的最后一列987654324@).

【讨论】:

  • 我不确定这一点,但我认为您可能已在东北角的条目中将 + 替换为 -
  • 我已经对此进行了编码,但效率极低。关键是要找到一个不依赖于矩阵的解决方案。 (问题相应地改变了,无论如何+1)
  • @Builder_K 所以 9 次乘法和 4 次加法(考虑到 -1 是 5 次)对于您想要实现的目标非常低效(同样只需要 R 的最后一列)?每帧需要计算多少次?
  • 取决于具体情况,数以千计。
  • 好吧,因为正确的答案包含乘法、加法和减法,所以无论您将其表示为矩阵还是以其他方式表示都无关紧要 - 这些都是您将要计算的得做。我真的不明白你怎么可能改进这一点。
猜你喜欢
  • 2012-06-11
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2013-03-30
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多