我需要在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;
答案 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}