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

Math 试图找到两个位置之间的相对变换-XNA,math,graphics,3d,xna,augmented-reality,Math,Graphics,3d,Xna,Augmented Reality,我已经用XNA编写了一个简单的AR程序,现在我正试图找到我的两个标记之间的相对转换 我已经定位了相对于相机的标记,并提取出标记的平移和旋转矩阵 我想做的是找出从标记1到标记2的相对翻译。例如,如果标记1和标记2位于同一Z平面上,则Z平移分量为0毫米 下图是在同一平面上工作的2个位置的应用程序: 我假设通过简单地将第二个标记的矩阵乘以第一个标记的逆矩阵,就可以得到平移。然而,我得到了完全错误的结果 我正在运行的代码如下所示: 位置估计位置(点、外矩阵、外变换) 浮动偏航、俯仰、横摇; 矩阵提取横

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

我已经定位了相对于相机的标记,并提取出标记的平移和旋转矩阵

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

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

我假设通过简单地将第二个标记的矩阵乘以第一个标记的逆矩阵,就可以得到平移。然而,我得到了完全错误的结果

我正在运行的代码如下所示:

位置估计位置(点、外矩阵、外变换)

浮动偏航、俯仰、横摇;
矩阵提取横摇(外偏航、外俯仰、外横摇);
矩阵旋转=
矩阵.CreateFromYawPitchRoll(-偏航、俯仰、横摇);
矩阵转换=
矩阵.CreateTranslation(新向量3(trans.X,trans.Y,-trans.Z));
矩阵完成=旋转*平移;
List all=新列表();
全部。添加(旋转);
全部。添加(翻译);
全部。添加(完成);
矩阵。添加(全部);
}
矩阵res=矩阵.逆(矩阵[0][2])*矩阵[1][2];
矢量3定标器;
向量3平移;
四元数旋转;
res.Decompose(向外缩放、向外旋转、向外平移);
结果是:

翻译:{X:-103.4285 Y:-104.1754 Z:104.9243}

我已经使用XNA将三维轴覆盖到上面所示的图像上,因此我假设相对于相机的旋转和平移已经正确计算出来

在计算翻译的过程中,我似乎做错了什么。我绝对不希望Z等于104毫米。我期待着一些类似于:


{X:0y:150z:0}

我以前做过类似的事情,但是它在2D环境中使用了3x3矩阵(使用X,Y平移,旋转,倾斜)。有问题的矩阵是否为4x4

是的,您是对的,要找到将对象A与矩阵M1转换为对象B与矩阵M2的矩阵,您可以计算M1'*M2(其中M1'是逆矩阵)

您可能遇到的问题是,矩阵由旋转、平移、缩放和其他变换(例如倾斜/透视)组成。将矩阵分解为其组成部分通常会得到一个不确定的答案。它就像二次方程一样,有不止一个解

另一个问题可能是矩阵运算不是可交换的,您只是以错误的方式执行它们。如果执行M1'*M2和M2*M1',将得到不同的结果

请尝试一下(切换矩阵顺序)。此外,我还将查找您使用的矩阵分解函数-您在输出中得到的旋转和缩放值是多少?对象是否旋转或缩放?如果不是,那么你应该得到零。请注意,可以使用多个旋转+平移解决方案来获得相同的最终结果,而分解函数不知道您要查找的是哪一个


要仅提取翻译组件,可以使用方法表单:

当你尝试的时候,你得到了什么

我想做的是找出相关的翻译来得到 从标记1到标记2

我的答案似乎过于简单,所以可能我没有完全理解你的问题,但它会创建一个向量,当添加到Marker1的位置(翻译)时,会将你带到Marker2的位置

            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);
vt = (M14, M24, M34)T
Vector3 relativeTranslation = Marker2Matrix.Translation - marker1Matrix.Translation;