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

Orientation 如何快速生成随机四元数?,orientation,quaternions,Orientation,Quaternions,我四处搜索,结果发现这个问题的答案出人意料地难以找到。有一种算法可以生成四元数形式的随机方向,但它们涉及sqrt和trig函数。我真的不需要一个均匀分布的方向。我只需要生成(许多)四元数,这样它们在方向上的随机性就“足够好”。我不能指定什么是“足够好”,除非我需要能够快速生成。生成它的最简单方法是,只要生成4个随机浮点,并在需要时对其进行规格化。若要稍后生成旋转矩阵,则可以跳过标准化,并且转换过程应注意非均匀四元数 引自: 选择三个点u、v、w∈ [0,1]均匀随机。统一的随机四元数由简单表达式

我四处搜索,结果发现这个问题的答案出人意料地难以找到。有一种算法可以生成四元数形式的随机方向,但它们涉及sqrt和trig函数。我真的不需要一个均匀分布的方向。我只需要生成(许多)四元数,这样它们在方向上的随机性就“足够好”。我不能指定什么是“足够好”,除非我需要能够快速生成。生成它的最简单方法是,只要生成4个随机浮点,并在需要时对其进行规格化。若要稍后生成旋转矩阵,则可以跳过标准化,并且转换过程应注意非均匀四元数

引自:

选择三个点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)摘自:

  • 在(-1..1)中均匀地生成独立的x,y,直到z=x²+y²<1
  • 在(-1..1)中均匀地生成独立的u,v,直到w=u²+v²<1
  • 计算s=√((1-z)/w)
  • 返回四元数(x,y,su,sv)。它已经正常化了
  • 这将生成均匀的随机旋转,因为4D球体、单位四元数和3D旋转具有等效的度量

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

    四元数随机四元数(){
    双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);
    返回四元数(x,y,s*u,s*v);
    }
    
    此方法的近似方向分布是什么?它围绕某些方向聚集吗?“我真的不需要一个均匀分布的方向”,如果你在相等的正负(-N,+N)范围内生成随机数,那么分布就足够像近似的均匀分布,不需要均匀分布和想要知道近似分布是不一样的。它不像2D那样,我可以画出东西,然后用眼睛观察它。这就是问题所在。这是一个可怕的想法(我知道,因为我实施了它并承受了后果)。由此产生的分布有很大的偏差。这是一张对比正确方式(蓝色球体)和快速方式(红色球体)的图片:这不是一个“随机”四元数,那么。@DoctorMohawk Non-uniform并不意味着非随机。特别是对于我的用例,“足够好”意味着可以生成每个有效的规范化四元数。