[英]Change 3D coordinate system do 2D for triangulation
我需要在3D空間中對n個點的多邊形進行三角剖分。 問題是我只使用2D三角剖分的庫。 由於我的多邊形可以在3D空間中的任何平面中定向,因此我需要將這些點轉換為2D,然后進行三角剖分,必須將其轉換回原始3D坐標系。
我想我迷失了從3D到2D轉換矩陣的創建。
這是我在做什么:
1-將新2D坐標系的X軸定義為P2-P1 2-將輔助軸定義為P3-P1 3-由於X和輔助軸是共面的,所以我使用叉積來找到Z軸4-現在我有了X和Z的乘積得到Y軸5-歸一化所有軸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;
您所擁有的是一個變換trans,它以均勻坐標遵循(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)
。
我認為您錯過了對假定原點的轉換,並且沒有反轉轉換矩陣。 所以像這樣:
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}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.