【问题标题】:Remove Duplicate Vertices at Runtime in Unity在 Unity 运行时删除重复的顶点
【发布时间】:2013-03-25 21:05:57
【问题描述】:

在我的 Unity 项目中,我有一个需要大量优化的动态网格系统。目前我正在寻找一种算法来通过在运行时删除重复的顶点来优化网格(网格被组合成一个巨大的网格)。删除占据相同空间的重复面相当容易,因为如果它们在阈值内共享相同空间,则可以安全地删除它们(因为它们不会显示)。

我在处理重复顶点时遇到了一些麻烦,因为它们需要以某种方式移除,否则网格会完全混乱。在我最初尝试之后,我得到了一个包含顶点的 Vector3 对象数组,并且我能够在一定程度上对其进行操作。似乎删除只是其中的一半,因为在更多地研究网格拓扑之后,似乎我需要在删除另一个之后进行更多的合并。

这是我基本上被卡住的部分。表面上,我认为这将是相当简单的。获取所有需要删除的顶点附加到的三角形,并将三角形重新分配给保留的顶点。但是在实践中并不是那么容易。

首先,有没有更简单的方法?我很惊讶 Unity 在某处没有合并顶点脚本,或者至少没有一个示例。其次,有没有更好的方法,如何?我遇到了空间散列,但是,我仍然停留在我以某种方式合并顶点的部分。第三,合并实际顶点。我应该如何以最有效的方式解决这个问题?

【问题讨论】:

  • 在 Unity 4 之后,在 Droid 和 iOS 发布的设置中,他们确实有一个名为“优化网格”的通用复选框。我不知道它是否会优化到您在上面谈论的程度。您是针对移动平台优化顶点以提高 FPS,还是针对 Web 项目/独立的?只是好奇..
  • @AmitApollo 该项目用于桌面,它被用于在运行时构建网格。基本上是一个关卡编辑器,如果你愿意的话,但它主要由基于网格的元素组成。我正在组合网格,因此删除面(这比顶点容易得多)和顶点将带来相当大的性能提升。
  • 我不明白您究竟是如何获得重复顶点的。你能解释一下吗?
  • @Xerosigma 当然可以。正如我在之前的评论中所说,用户将以完全动态的方式放置网格。然后将这些网格组合成一个静态网格,可以在 3D 中实时查看。我正在寻找优化组合网格将具有的所有重复顶点/面。想象两个立方体被用户砸在一起。当我优化它时,我将删除两个看不见的面(即重复的面),但仍然有重复的顶点,它们之间的距离约为 0.01f。检测和合并这些顶点是我难过的地方。
  • @user81572 不要增加问题,但您也应该了解 Unity 如何处理 UVs and normals。 Unity 使用沿 UV 接缝的重复顶点。例如,添加一个 Unity 立方体,您会看到它有 24 个顶点,而不是 8 个。Here is a forum script 用于创建八叉树,有助于降低重复搜索的复杂性。

标签: c# algorithm unity3d


【解决方案1】:

在这种情况下使用 HashSet 有用吗?对于那些不知道的人,HashSet 就像一个列表,但在搜索元素时要快得多。由于 HashSet 的性质,它们不能存储重复项。将顶点存储在 HashSet 中可能意味着根本不会添加任何重复项,几乎不需要处理能力。

我知道这个问题很老,但我想我会尽力帮助其他寻找这个答案的人 - 我根本不是编程专家,只是认为写这个不会有什么坏处。

【讨论】:

    猜你喜欢
    • 2011-09-12
    • 1970-01-01
    • 2015-08-31
    • 2015-07-19
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多