簡體   English   中英

更改3D坐標系以進行2D三角剖分

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM