试图找到两个位置之间的相对转换 - XNA

时间:2012-01-01 15:00:59

标签: math graphics 3d xna augmented-reality

我在XNA中编写了一个简单的AR程序,现在我正试图找到我的2个标记之间的相对转换。

我找到了相对于我的相机的标记,并提取了标记的平移和旋转矩阵。

我要做的是找出从标记1到标记2的相对平移。例如,如果标记1和标记2位于同一Z平面上,则Z平移分量将为0mm。

下图是在同一平面上为2个位置工作的应用程序:

enter image description here

我认为通过简单地将第二个标记的矩阵乘以第一个标记的倒数,我就可以得到平移。但是我得到了完全错误的结果。

我正在运行的代码如下:

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}

2 个答案:

答案 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的位置。