我有一台带陀螺仪的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));
答案 0 :(得分:0)
最后我用OpenGL矩阵完成了它。我使用从phone给出的旋转矩阵和生成的投影矩阵的乘法。关键功能是将旋转坐标从iPhone转换为OpenGL(右手转为左手)。我用-x和-y获得了新的旋转轴,从这个新的轴和角度创建了新的旋转矩阵。而那个矩阵给了我正确的结果。