我四处寻找,结果发现这个问题的答案出人意料地很难找到。有一种算法可以生成四元数形式的随机方向,但它们涉及 sqrt 和 trig 函数。我真的不需要均匀分布的方向。我只需要生成(许多)四元数,使其方向随机性“足够好”。除了我需要能够快速生成之外,我无法指定什么是“足够好”。
引自http://planning.cs.uiuc.edu/node198.html:
随机均匀地选择三个点u, v, w ∈ [0,1]。均匀的随机四元数由简单的表达式给出:
h = ( sqrt(1-u) sin(2πv), sqrt(1-u) cos(2πv), sqrt(u) sin(2πw), sqrt(u) cos(2πw))
来自 George Marsaglia 的从球体表面选择一个点:
这将生成均匀的随机旋转,因为 4D 球体、单位四元数和 3D 旋转具有等效的度量。
该算法使用1次平方根、1次除法,平均使用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);
}
最简单的生成方法,只需生成 4 个随机(正态分布)浮点数并根据需要对其进行标准化。如果您想稍后生成旋转矩阵,则可以跳过归一化,并且转换过程应注意非单位四元数。
有一个matlab函数randrot()来生成均匀分布的随机旋转 https://uk.mathworks.com/help/nav/ref/randrot.html 基于: [1] Shoemake, K.“均匀随机旋转”。 Graphics Gems III(K. David 编辑)。纽约:学术出版社,1992 年。