【问题标题】:iPhone rotation quaternion absolute coordinates?iPhone旋转四元数绝对坐标?
【发布时间】:2014-08-18 12:52:25
【问题描述】:

我有一部带陀螺仪的 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));

【问题讨论】:

    标签: ios matrix 3d quaternions gyroscope


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2013-07-07
      • 1970-01-01
      • 2019-11-22
      • 2022-08-17
      • 2014-01-09
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多