将Optitrack-NatNet-Quaternion转换为带有缩放轴的libgdx场景中的三维模型的旋转

时间:2014-01-22 18:58:02

标签: android 3d rotation libgdx quaternions

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

  

-0,465436 0,888108 -0,991635 0,331507 0,091413 -0,379475 0,858921

     

-0,438584 0,888583 -0,982334 0,356608 0,092872 -0,364935 0,855002

     

-0,414451 0,892762 -0,973772 0,365460 0,096244 -0,348293 0,857828

     

-0,394074 0,900471 -0,963359 0,365230 0,109444 -0,323559 0,865990

前三个值描述了房间中的位置。我们将z轴的值缩放3倍,以便从我们接收的小值到我们在平板电脑上的渲染libgdx场景中所需的大小进行非常平移,并且它工作正常!最后4个值用于将跟踪的平板电脑旋转为四元数。这对我来说真的很新,因为我之前从未使用过四元数。 Libgdx支持使用四元数的3D场景中的旋转,但在将值移交给具体的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 Quaternion类。旋转值似乎是右手坐标系中的相对(局部)形式。至少这是第12页官方NatNet用户指南中的内容: NatNet User Guide 。我认为libgdx使用绝对的Quaternions,但我无法确定它。如果是这种情况......我怎么能将相对四元数转换成绝对的四元数?或者它可能需要对我们的z轴值进行缩放? 我们非常感谢您的帮助。提前谢谢!

0 个答案:

没有答案