我在XNA中编写了一个简单的AR程序,现在我正试图找到我的2个标记之间的相对转换。
我找到了相对于我的相机的标记,并提取了标记的平移和旋转矩阵。
我要做的是找出从标记1到标记2的相对平移。例如,如果标记1和标记2位于同一Z平面上,则Z平移分量将为0mm。
下图是在同一平面上为2个位置工作的应用程序:
我认为通过简单地将第二个标记的矩阵乘以第一个标记的倒数,我就可以得到平移。但是我得到了完全错误的结果。
我正在运行的代码如下:
posit.EstimatePose(指出,指出矩阵,指出反式);
float yaw, pitch, roll;
matrix.ExtractYawPitchRoll(out yaw, out pitch, out roll);
Matrix rotation =
Matrix.CreateFromYawPitchRoll(-yaw, -pitch, roll);
Matrix translation =
Matrix.CreateTranslation(new Vector3(trans.X, trans.Y, -trans.Z));
Matrix complete = rotation * translation;
List<Matrix> all = new List<Matrix>();
all.Add(rotation);
all.Add(translation);
all.Add(complete);
matrixes.Add(all);
}
Matrix res = Matrix.Invert(matrixes[0][2]) * matrixes[1][2];
Vector3 scaleR;
Vector3 translationR;
Quaternion rotationR;
res.Decompose(out scaleR, out rotationR, out translationR);
结果:
TranslationR:{X:-103.4285 Y:-104.1754 Z:104.9243}
我已经使用XNA将3D轴重叠到图像上,如上所示,所以我假设相对于相机的旋转和平移已经正确计算出来。
在计算翻译的过程中,我似乎做错了。我绝对不会期望Z等于104mm。我期待的是:
{X:0 Y:150 Z:0}
答案 0 :(得分:0)
之前我做过类似的事情,但它在2D环境中使用3x3矩阵(使用X,Y Translate,Rotate,Skew)。问题矩阵是4x4吗?
是的你是对的,找到用矩阵M1将对象A转换为矩阵M2的对象B的矩阵,你可以计算M1'* M2(其中M1'是反向的)。
您可能遇到的问题是Matrix由旋转,平移,缩放和其他变换(例如倾斜/透视)组成。将矩阵分解为其组成部分通常会产生非确定性的答案。它像二次方程式,有不止一个解决方案。
另一个问题可能是Matrix操作不是可交换的,而你只是以错误的方式执行它们。如果您执行M1'* M2和M2 * M1',您将得到不同的结果。
请试一试(切换矩阵顺序)。此外,我将查找您使用的矩阵分解函数 - 旋转和放大器的值。缩放是你得到输出?您的对象是旋转还是缩放?如果没有,那么你应该得到零。请注意,可以使用多个旋转+平移解决方案来获得相同的最终结果,并且分解函数不知道您正在寻找哪个。
要仅提取翻译组件,您可以使用this page形式的方法:
vt = (M14, M24, M34)T
尝试时会得到什么?
答案 1 :(得分:0)
我要做的是找出要获得的相对翻译 从标记1到标记2。
Vector3 relativeTranslation = Marker2Matrix.Translation - marker1Matrix.Translation;
我的回答似乎过于简单,所以也许我没有完全理解你的问题,但它会创建一个向量,当添加到Marker1的位置(翻译)时,会转到Marker 2的位置。