Android 将Optitrack NatNet四元数转换为具有缩放轴的libgdx场景中三维模型的旋转

Android 将Optitrack NatNet四元数转换为具有缩放轴的libgdx场景中三维模型的旋转,android,3d,rotation,libgdx,quaternions,Android,3d,Rotation,Libgdx,Quaternions,我们使用标记和Optitrack系统跟踪平板电脑。因此,我们使用JNI包装器来访问NATNETSDK的函数。在服务器上接收到位置数据后,我们将其流式传输(实时)回客户端-平板电脑本身,并使用libgdx框架渲染增强现实场景。目标平台是Android。 下面是我们收到的一些示例数据(7个值:x、y、z、qx、qy、qz、qw): -0465436 0888108-0991635 0331507 0091413-0379475 0858921 -0438584 0888583-0982334 035

我们使用标记和Optitrack系统跟踪平板电脑。因此,我们使用JNI包装器来访问NATNETSDK的函数。在服务器上接收到位置数据后,我们将其流式传输(实时)回客户端-平板电脑本身,并使用libgdx框架渲染增强现实场景。目标平台是Android。 下面是我们收到的一些示例数据(7个值:x、y、z、qx、qy、qz、qw):

-0465436 0888108-0991635 0331507 0091413-0379475 0858921

-0438584 0888583-0982334 0356608 0092872-0364935 0855002

-0414451 0892762-0973772 0365460 0096244-0348293 0857828

-0394074 0900471-0963359 0365230 0109444-0323559 0865990

前三个值描述了房间中的位置。我们将z轴的值缩放3倍,以便将接收到的小值自动转换为平板电脑上渲染libgdx场景所需的大小,效果良好!最后4个值用于将跟踪的数字化仪旋转为四元数。这对我来说真的很新鲜,因为我以前从未使用过四元数。 Libgdx支持在具有四元数的三维场景中进行旋转,但将值传递给具体的modelInstance后,旋转完全是意外的,并且充满了错误。以下是重要的代码:

    //gets the rotation of the latest received rigidbody position data 
    //and stores them into a libgdx Quaternion
    Quaternion rotation = rigidBody.getQuat();

    modelInst.transform.rotate(rotation);

    ...

    public Quaterion getQuat(){
       float qx = rigidBody.qx;
       float qy = rigidBody.qy;
       float qz = rigidBody.qy;
       float qw = rigidBody.qw;

       Quaternion rot = new Quaternion(qx, qy, qz, qw);
       return rot;
    }
到目前为止对我来说很明显。但这是行不通的。当我旋转平板电脑时,它也会平移,并在错误和意外的方向旋转,而不会平移平板电脑。我已经寻找解决方案一周了。首先,我尝试了参数的不同排列,并将其交给libgdx四元数类。在右手坐标系中,旋转值似乎是相对(局部)形式。至少这是NatNet官方用户指南第12页所写的内容: . 我认为libgdx使用的是绝对四元数,但我不能确定。如果是这样的话……我怎么能把相对四元数转换成绝对四元数呢?或者它可能与我们对z轴值的缩放有关?
我们感谢你的帮助。提前谢谢你

我肯定会先删除z轴缩放并修复旋转问题。相对v.s.全局仅与欧拉角转换相关。但是,您需要知道(四元数)旋转是在平移之前还是之后应用的。首先旋转,然后平移。这应该是正确的顺序。我已经移除了z轴的缩放。此外,我只应用modelInstance的旋转(无平移)进行测试,但行为似乎没有改变。围绕z轴的旋转工作正常,但围绕x轴和y轴的旋转总是伴随着一些平移。它看起来像是从它应该围绕的给定轴的某种偏移。就像一颗围绕固定点旋转的卫星。。。