在Unity中创建自定义凸包和网格

时间:2019-04-01 15:20:40

标签: c# unity3d mesh convex-hull

我目前正在尝试将复杂的搜索字段实施到我正在研究的统一项目中,用户可以在该项目中将点生成到场景中。我的目标是根据用户创建的点为该用户创建自定义形状,然后我想检测其他对象是否在该形状内,这类似于检测复杂船体内的点(仍然不稳定)关于其背后的理论,但可以找到一个示例here)。如果可能的话,如果以后再移动这些点,我还希望该形状能够自动更新,使其具有几乎弹性,可拉伸的感觉。

到目前为止,我在网上找到的每个教程或资源都使用完全相同的基本示例,其中脚本将新的verts,UVs和三角形分配给自定义网格,以使用两个三角形制作一个平面,但这非常令人沮丧,当我根本不知道最终形状是什么样,或者即使用户在场景中只有五个点时,实际绘制的三角形是什么,也绝对无济于事。

截至目前,我能想到的最接近的视觉表示形式具有一个List来跟踪用户的点,以及一个脚本,该脚本仅使用LineRenderers绘制了一系列伪三角形,以连接每个点,即使不是通过多次遍历List来实现外观。虽然看起来很接近我想要的东西,但实际上它并没有任何用处,因为我不知道如何“填充”这些面孔,并且在对象是否为物体时我仍然相对迷失在船体内部,如下面示例中显示的红色球体所示。

Angle 1

Angle 2

我还可以在Update()方法期间反复销毁并重画这些线条,这使我可以抓住一个点并四处移动,从而导致形状动态变化,但是这会导致不良的闪烁效果,暂时避免。

由于这是一个广泛的问题,我还包括了下面用来绘制这些线条的方法,该方法将一堆形状像三角形的线条与一个空的游戏对象关联起来,以便于销毁和娱乐:

void drawHull()
{
    if (!GameObject.Find("hullHold"))
    {
        hullHold = new GameObject();
        hullHold.name = "hullHold";
    }

    foreach(GameObject point in points)
    {
        for (int i = points.IndexOf(point); i < points.Count - 2; i++)
        {
            lineEdge = Instantiate(lineReference);
            lineEdge.name = "Triangle" + i;
            lineEdge.GetComponent<LineRenderer>().startColor = Color.black;
            lineEdge.GetComponent<LineRenderer>().endColor = Color.black;
            lineEdge.GetComponent<LineRenderer>().positionCount = 3;
            lineEdge.GetComponent<LineRenderer>().SetPosition(0, points[points.IndexOf(point)].transform.position);
            lineEdge.GetComponent<LineRenderer>().SetPosition(1, points[i + 1].transform.position);
            lineEdge.GetComponent<LineRenderer>().SetPosition(2, points[i + 2].transform.position);
            lineEdge.GetComponent<LineRenderer>().loop = true;
            lineEdge.SetActive(true);
            lineEdge.transform.SetParent(hullHold.transform);
        }
    }
}

如果有人在我根本找不到的其他地方遇到过类似问题,请告诉我!从创建自定义网格物体的更多知识到更深入的知识,以及确定点是否在凸包内部的对初学者友好的解释,都将非常有帮助。如果这一切都有意义的话,我正在使用VR并运行2018.2.6f1版,以确保Oculus rift软件包和Unity能够很好地协作,但是在几个月后的环境中工作没有任何问题。

谢谢!

1 个答案:

答案 0 :(得分:0)

您确实提到了将顶点和Tris关联到网格-这是统一实现“正确”的方法,因为它与高度优化的MeshRenderer绑定在一起,而且我相信Colliders能够在给定形状的情况下使用网格这样,因此您应该能够插入PhysX并查询与网格重叠的对撞机。手工操作,又要遍历面部并确定对象的实际边界,实际上很难有效地完成