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