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

问题描述 投票:0回答:4

我四处寻找,结果发现这个问题的答案出人意料地很难找到。有一种算法可以生成四元数形式的随机方向,但它们涉及 sqrt 和 trig 函数。我真的不需要均匀分布的方向。我只需要生成(许多)四元数,使其方向随机性“足够好”。除了我需要能够快速生成之外,我无法指定什么是“足够好”。

orientation quaternions
4个回答
15
投票

引自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))


5
投票

来自 George Marsaglia 的从球体表面选择一个点

  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 旋转具有等效的度量。

该算法使用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);
}

1
投票

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


0
投票

有一个matlab函数randrot()来生成均匀分布的随机旋转 https://uk.mathworks.com/help/nav/ref/randrot.html 基于: [1] Shoemake, K.“均匀随机旋转”。 Graphics Gems III(K. David 编辑)。纽约:学术出版社,1992 年。

© www.soinside.com 2019 - 2024. All rights reserved.