猿问

Unity中如何将一些3D点都在同一平面上降维为2D?

if(dread[6].ToString = = "True")

{

    CheckBox7.Checked = "true";

}

else

    CheckBox7.Checked = "false";

}

由于Triangulator仅适用于 2D,并且所有点都在同一平面上,因此方法应该是计算基向量或平面的主成分,但我找不到方法。我想将点的维数减少到 2D,以便Triangulator以生成的三角形位于平面上的方式用于它们。

所以我想要的输出只是三角形。

的源代码Triangulator这里,我的目标是为给定的点创建一个网格,但是正如您看到以下示例代码一样,三角测量仪的输入点应该是二维的:

using UnityEngine;


public class PolygonTester : MonoBehaviour {

    void Start () {

        // Create Vector2 vertices

        Vector2[] vertices2D = new Vector2[] {

            new Vector2(0,0),

            new Vector2(0,50),

            new Vector2(50,50),

            new Vector2(50,100)

        };


        // Use the triangulator to get indices for creating triangles

        Triangulator tr = new Triangulator(vertices2D);

        int[] indices = tr.Triangulate();


        // Create the Vector3 vertices

        Vector3[] vertices = new Vector3[vertices2D.Length];

        for (int i=0; i<vertices.Length; i++) {

            vertices[i] = new Vector3(vertices2D[i].x, vertices2D[i].y, 0);

        }


        // Create the mesh

        Mesh msh = new Mesh();

        msh.vertices = vertices;

        msh.triangles = indices;

        msh.RecalculateNormals();

        msh.RecalculateBounds();


        // Set up game object with mesh;

        gameObject.AddComponent(typeof(MeshRenderer));

        MeshFilter filter = gameObject.AddComponent(typeof(MeshFilter)) as MeshFilter;

        filter.mesh = msh;

    }

}


潇湘沐
浏览 238回答 1
1回答

元芳怎么了

解决方案 1 - 平凡如果四边形是凸的并且您知道顶点的顺序,请使用indices = new double[6]{0,1,2,0,2,3};解决方案 2 - 手动三角测量如果四边形是凸的,但您不确定顺序,请测试方向并调整索引。edge1 = vertices3D[1] - vertices3D[0];edge2 = vertices3D[2] - vertices3D[0];edge3 = vertices3D[3] - vertices3D[0];normal12 = Vector3.Cross(edge1, edge2);normal23 = Vector3.Cross(edge2, edge3);if (Vector3.Dot(normal12, normal23) > 0)&nbsp; &nbsp;indices = new double[6]{0,1,2,0,2,3};else&nbsp; &nbsp;indices = new double[6]{0,1,3,0,3,2};解决方案 3 - 使用三角测量仪如果四边形不是凸的,或者您确实必须使用库 Triangulator,请变换所有顶点,使它们位于 XY 平面上,第一个顶点位于(0,0,0).edge1 = vertices3D[1] - vertices3D[0];edge2 = vertices3D[2] - vertices3D[0];normal = Vector3.Cross(edge1, edge2).normalized;rotation = Quaternion.FromToRotation(normal, new Vector3(0,0,1));Vector2[] vertices2D = new Vector2[vertices3D.Length];for (int i=0; i<vertices3D.Length; i++) {&nbsp; &nbsp; rotatedVertex = rotation * (vertices3D[i]-vertices3D[0]);&nbsp; &nbsp; vertices2D[i] = new Vector2(rotatedVertex.x, rotatedVertex.y);}我不建议仅将 4 个点用于形成墙的三角测量仪。但是,对于复杂的多边形和非凸形状,它应该会很方便。
随时随地看视频慕课网APP
我要回答