iPhone旋转四元数绝对坐标?

时间:2014-08-18 12:52:25

标签: ios matrix 3d quaternions gyroscope

我有一台带陀螺仪的iPhone。

假设我有一个手机旋转Q的四元数。

我想在屏幕上显示世界绝对坐标的相对点。因此,在我的手机每次旋转时,这些点将在真实的3D空间中“静止”(一种增强现实)。假设形成一个矩形是4个点。

所以我相对于手机屏幕在3d空间中创建了4个点,并将Q的转换应用到每个点。

我认为它应该非常简单,但是我的点变换不是相对于世界坐标而是相对于我不理解的坐标,可能与电话轴相关?你能帮帮我吗?我需要在屏幕上创建新视图,该视图将从绝对3d空间中的虚拟点投影到旋转的相机。

只要我没有沿着“正常”轴(垂直于屏幕)旋转手机,我的旋转结果似乎是正确的。但是在那个方向上的旋转会导致完全错误的点转换。

包括伪代码。

motionManager.StartDeviceMotionUpdates

        Quaternion Q;//quaternion read from CMAttitude above, relative frame: XArbitraryZVertical
        var Qi=Q.Conjugate;

        var vX = new Vector3d (-1, 0, 2);
        var vY = new Vector3d (1, 0, 2);
        var vZ = new Vector3d (1, 0, -2);
        var vW = new Vector3d (-1, 0, -2);

        var vXn=Vector3d.Transform(vX,Qi);
        var vYn=Vector3d.Transform(vX,Qi);
        var vZn=Vector3d.Transform(vX,Qi);
        var vWn=Vector3d.Transform(vW,Qi);

        var convertPixels = 50;

        vXn = vXn * convertPixels;
        vYn = vYn * convertPixels;
        vZn = vZn * convertPixels;
        vWn = vWn * convertPixels;

        //screen projection

        X.Frame = new RectangleF (new PointF ((float)(videoArea.Width / 2 + vXn.X), (float)(videoArea.Height / 2 + vXn.Z)), new SizeF (10, 10));
        Y.Frame = new RectangleF (new PointF ((float)(videoArea.Width / 2 + vYn.X), (float)(videoArea.Height / 2 + vYn.Z)), new SizeF (10, 10));
        Z.Frame = new RectangleF (new PointF ((float)(videoArea.Width / 2 + vZn.X), (float)(videoArea.Height / 2 + vZn.Z)), new SizeF (10, 10));
        W.Frame = new RectangleF (new PointF ((float)(videoArea.Width / 2 + vWn.X), (float)(videoArea.Height / 2 + vWn.Z)), new SizeF (10, 10));

1 个答案:

答案 0 :(得分:0)

最后我用OpenGL矩阵完成了它。我使用从phone给出的旋转矩阵和生成的投影矩阵的乘法。关键功能是将旋转坐标从iPhone转换为OpenGL(右手转为左手)。我用-x和-y获得了新的旋转轴,从这个新的轴和角度创建了新的旋转矩阵。而那个矩阵给了我正确的结果。