如何快速生成随机四元数?

时间:2015-07-24 01:26:07

标签: orientation quaternions

我四处寻找,事实证明这个答案很难找到。那里的Theres算法可以生成四元数形式的随机方向,但它们涉及sqrt和trig函数。我真的不需要均匀分布的方向。我只需要生成(许多)四元数,使得它们的方向随机性“足够好”。我不能指出什么是“足够好”,除了我需要能够快速完成这一代。

3 个答案:

答案 0 :(得分:2)

引自http://planning.cs.uiuc.edu/node198.html

随机选择三个点$ u_1,u_2,u_3 \ in [0,1] $。简单表达式给出了一个统一的随机四元数  $ \ displaystyle h =(\ sqrt {1-u_1} \ sin 2 \ pi u_2,\; \ sqrt {1-u_1} \ cos 2 \ pi u_2,\; \ sqrt {u_1} \ sin 2 \ pi u_3, \; \ sqrt {u_1} \ cos 2 \ pi u_3)。$

答案 1 :(得分:1)

生成它的最简单方法,只需生成4个随机浮点数并根据需要对其进行标准化。如果您希望稍后生成旋转矩阵,则可以跳过标准化,并且转换过程应注意非单元四元数。

答案 2 :(得分:0)

摘自George Marsaglia的Choosing a Point from the Surface of a Sphere

  1. 在(-1..1)中统一生成独立的 x y ,直到 z = x ² + y ²<1。
  2. 在(-1..1)中统一生成独立的 u v ,直到 w = u ² + v ²<1。
  3. 计算 s =√((1- z )/ w )。
  4. 返回四元数( x y su sv )。已经标准化了。

这将产生均匀的随机旋转,因为4D球体,单位四元数和3D旋转具有相同的度量。

该算法平均使用一个平方根,一个除法和16 /π≈5.09随机数。 C ++代码:

Quaternion random_quaternion() {
  double x,y,z, u,v,w, s;
  do { x = random(-1,1); y = random(-1,1); z = x*x + y*y; } while (z > 1);
  do { u = random(-1,1); v = random(-1,1); w = u*u + v*v; } while (w > 1);
  s = sqrt((1-z) / w);
  return Quaternion(x, y, s*u, s*v);
}