【问题标题】:How to cut a mesh by plane in Unity3d如何在 Unity3d 中通过平面切割网格
【发布时间】:2022-04-19 02:29:37
【问题描述】:

我想用平面切割网格。 试试这段代码,但只得到切割网格的一部分。

Screenshot 1

Screenshot 2

public void SliceIt()
{
    Vector3[] vertices = mesh.vertices;

    Transform clone = clone = ((Transform)Instantiate(transform, transform.position + new Vector3(0, 0.25f, 0), transform.rotation));

    Mesh meshSlice  = clone.GetComponent<MeshFilter>().sharedMesh;
    Vector3[] verticesSlice = meshSlice.vertices;

    List<Vector3> verticesSlice2 = new List<Vector3>();

    Mesh cutplanemesh  = cutplane.GetComponent<MeshFilter>().sharedMesh;
    Vector3[] cutplanevertices = cutplanemesh.vertices;

    p1 = cutplane.TransformPoint(cutplanevertices[40]);
    p2 = cutplane.TransformPoint(cutplanevertices[20]);
    p3 = cutplane.TransformPoint(cutplanevertices[0]);
    var myplane = new Plane(p1, p2, p3);

    for (var i = 0; i < vertices.Length; i++)
    {
        var tmpverts = transform.TransformPoint(vertices[i]); // original object vertices

        if (myplane.GetSide(tmpverts))
        {
            vertices[i] = transform.InverseTransformPoint(new Vector3(tmpverts.x, tmpverts.y - (myplane.GetDistanceToPoint(tmpverts)), tmpverts.z));

            verticesSlice[i] = transform.InverseTransformPoint(new Vector3(tmpverts.x, tmpverts.y, tmpverts.z));
            var v = transform.InverseTransformPoint(new Vector3(tmpverts.x, tmpverts.y, tmpverts.z));
            verticesSlice2.Add(v);
        }
        else
        {
            var v = transform.InverseTransformPoint(new Vector3(tmpverts.x, tmpverts.y - (myplane.GetDistanceToPoint(tmpverts)), tmpverts.z));
            verticesSlice2.Add(v);
        }
    }

    mesh.vertices = verticesSlice;
    mesh.RecalculateBounds();

    meshSlice.vertices = verticesSlice2.ToArray();
    meshSlice.RecalculateBounds();

}

我从here 得到这个代码。

我也读过这个question,但我不知道如何分割属于平面正侧和负侧的三角形。

【问题讨论】:

    标签: unity3d mesh


    【解决方案1】:

    您可以使用资产商店中已有的资产: https://www.assetstore.unity3d.com/#!/content/59618

    它不仅可以切割网格,还可以切割碰撞器,进行一些优化并且可以扩展。

    【讨论】:

    • 这是正确答案。从头开始编写网格切割软件是不可思议的。 (请注意,“统一”与该问题无关。)这很像问“我正在尝试在 Unity 中使用 SQL 数据库,并且,我需要知道如何从头开始设计 SQL 数据库。 "它只是............没有多大意义。
    • 理想情况下,您不应建议 OP 必须支付的费用。你不知道他们的预算,免费的选择是理想的。
    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 2014-01-21
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多