【发布时间】: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