更改3D坐标系做2D三角测量

时间:2015-01-21 13:00:20

标签: c# matrix 3d

我需要在3D空间中对n个点的多边形进行三角测量。问题是我只在2D中使用三角测量库。由于我的多边形可以在3D空间的任何平面上定向,我需要将这些点转换为2D和三角形,我必须将它们转换回原始的3D坐标系。

我认为我在创建转换矩阵时迷失了方向,从3D到2D。

这就是我正在做的事情:

1 - 将新2D坐标系的X轴定义为P2-P1 2 - 将辅助轴定义为P3 - P1 3 - 由于X和辅助器是共面的,我使用叉积来找到Z轴 4 - 现在我有X和Z,交叉产品得到Y轴 5 - Normaliza所有轴 6 - 使用这些新轴创建变换矩阵 7 - 将原始点乘以变换矩阵

由于所有点现在都是共面的,因此它们的Z坐标应为零,但这不是正在发生的事情。 Z坐标应该至少相等,因为我知道我应该以某种方式将翻译放在矩阵中......

我做错了什么?

这是一个小例子:

        Point4D p1 = new Point4D(1, -0.75, -0.3, 1);
        Point4D p2 = new Point4D(1,  0.75, -0.3, 1);
        Point4D p3 = new Point4D(1,  0.75,  0.3, 1);
        Point4D p4 = new Point4D(1, -0.75,  0.3, 1);

        Vector3D xAxis = new Vector3D(p2.X - p1.X, p2.Y - p1.Y, p2.Z - p1.Z);
        Vector3D hAxis = new Vector3D(p3.X - p1.X, p3.Y - p1.Y, p3.Z - p1.Z);
        Vector3D zAxis = Vector3D.CrossProduct(xAxis, hAxis);
        Vector3D yAxis = Vector3D.CrossProduct(zAxis, xAxis);

        xAxis.Normalize();
        yAxis.Normalize();
        zAxis.Normalize();

        Matrix3D trans = new Matrix3D(xAxis.X, xAxis.Y, xAxis.Z, 0,
                                      yAxis.X, yAxis.Y, yAxis.Z, 0,
                                      zAxis.X, zAxis.Y, zAxis.Z, 0,
                                      0,       0,       0,       1);

        Point4D n1 = p1 * trans;
        Point4D n2 = p2 * trans;
        Point4D n3 = p3 * trans;
        Point4D n4 = p4 * trans;

2 个答案:

答案 0 :(得分:1)

你所拥有的是一种服从的转型(1,0,0,1)*trans=xAxis表示同源坐标中的全局坐标x轴(1,0,0,1)。同样地(0,1,0,1)*trans=yAxis(0,0,1,1)*trans=zAxis

但你想要一个带有xAxis*A--->(1,0,0,1)的转换A,依此类推,对吧?所以我认为你应该反转trans并做n1=p1*invert(trans)

答案 1 :(得分:1)

我认为你错过了对假设原点的转换,而你没有反转转换矩阵。所以像这样:

        Point4D p1 = new Point4D(1, -0.75, -0.3, 1);
        Point4D p2 = new Point4D(1, 0.75, -0.3, 1);
        Point4D p3 = new Point4D(1, 0.75, 0.3, 1);
        Point4D p4 = new Point4D(1, -0.75, 0.3, 1);

        Vector3D xAxis = new Vector3D(p2.X - p1.X, p2.Y - p1.Y, p2.Z - p1.Z);
        Vector3D hAxis = new Vector3D(p3.X - p1.X, p3.Y - p1.Y, p3.Z - p1.Z);
        Vector3D zAxis = Vector3D.CrossProduct(xAxis, hAxis);
        Vector3D yAxis = Vector3D.CrossProduct(zAxis, xAxis);

        xAxis.Normalize();
        yAxis.Normalize();
        zAxis.Normalize();

        Matrix3D trans = new Matrix3D(xAxis.X, xAxis.Y, xAxis.Z, 0,
                                      yAxis.X, yAxis.Y, yAxis.Z, 0,
                                      zAxis.X, zAxis.Y, zAxis.Z, 0,
                                      p1.X, p1.Y, p1.Z, 1);    // **** changed this
        trans.Invert();    // **** added this

        Point4D n1 = p1 * trans;
        Point4D n2 = p2 * trans;
        Point4D n3 = p3 * trans;
        Point4D n4 = p4 * trans;

对于您的测试点,这会得到以下结果:

n1 { 0,    0, 0, 1}
n2 {1.5,   0, 0, 1}
n3 {1.5, 0.6, 0, 1}
n4 {  0, 0.6, 0, 1}