【发布时间】:2019-08-22 19:39:18
【问题描述】:
我目前正在尝试将复杂的搜索字段实现到我正在从事的统一项目中,用户可以在其中将点生成到场景中。我的目标是根据他们创建的点为该用户创建一个自定义形状,然后我想检测其他对象是否在该形状内,类似于检测复杂船体内的点(仍然不稳定关于这背后的理论,但可以找到一个例子here)。如果可能的话,我还希望形状在稍后移动点时自行更新,使其具有几乎有弹性、有弹性的感觉。
到目前为止,我在网上找到的每个教程或资源都使用完全相同的基本示例,其中脚本将新的顶点、UV 和三角形分配给自定义网格以使用两个三角形制作平面,但这非常简单,当我根本不知道最终的形状会是什么样子,或者即使用户在场景中只有五个点时实际绘制的三角形是什么时,这绝对是无用的。
到目前为止,我能想出的最接近的视觉表示是一个 List 跟踪用户的点,以及一个脚本,它使用 LineRenderers 绘制一堆伪三角形来连接每个点,即使是那些'不是外部面,通过多次迭代列表。虽然这看起来很接近我想要的,但它实际上并没有任何用处,因为我不知道如何“填充”这些面孔,而且当涉及到一个物体是否是在该船体内部,如下例所示的红色球体。
我还可以在 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 运行良好,但我在几个月后的环境中工作没有任何问题。
谢谢!
【问题讨论】:
-
好吧,这个问题有点宽泛,但据我了解,您的问题是找出三角形的最近点,因为用户不一定点击相邻位置。为此,您可以查看this
标签: c# unity3d mesh convex-hull