将3D网格分解为2D模型

17
假设您有一个三维对象,表示为某种常见文件格式中的三维网格。您如何设计算法将该网格分解为一个或多个二维“网络” - 也就是可以剪下和折叠以创建原始三维对象的二维表示。
算法需要考虑以下因素之一:
- 任何给定对象可能存在多个分解 - 处理将网格适配到固定大小的画布(纸张)。 - 识别网络中两个面板会重叠(因此无效)的情况。 - 如果网格由于重叠或页面大小限制而不能表示为单一网格,则将其分解为多个网格。 - 在适当的位置生成标签,用于连接相邻面。
显然,退化案例只需为每个面创建一个网格,并在一半的边缘上添加标签。这显然不是理想的情况:理想情况是单个连续网格。对于复杂形状,现实可能处于中间某个地方。
我意识到找到最优网络(最少网络/最少页面)可能具有计算代价,但要找到“足够好”的网络的良好启发式方法就足够了。

嗨!非常有趣的话题。几年后有什么进展吗? - nkint
我刚刚偶然发现了这个问题,实际上有一款软件可以完全满足你所说的需求。具体如何操作,我不是很清楚。但它确实是一个非常棒的工具!http://www.tamasoft.co.jp/pepakura-en/ - Reed Jones
3个回答

10

当我读到你的问题时,"自动纸艺算法"这个词汇就出现在我的脑海中。所以我在谷歌上搜索并找到了Massarwi等人的论文使用广义圆柱体制作纸艺模型(pdf)。

我们提出了一种新的方法,通过基于条带的近似来从三角网格生成圆形玩具动物图案的展开纸艺模型。虽然原则上可以通过保留尽可能多的连接性并检查展开平面中的相交三角形来展开三角形模型,但创建成千上万个三角形的图案是不现实的。我们的方法是通过一组连续的没有内部顶点的三角形条带来逼近网格模型。最初,我们将网格分成与模型特征相对应的部分。我们将每个部分分成区域,将拓扑距离相似的三角形分组到一起。我们通过简化网格并保留区域边界和额外的切线来生成三角形条带。然后通过展开一组条带来创建图案。我们方法的独特之处在于,我们通过一组连续的条带逼近网格模型,而不是通过圆锥或圆柱体等其他规则曲面的部分。因此,只需使用网格操作和简单的展开算法即可生成逼近的展开图案。此外,一组条带可以通过弯曲纸张(而不是断边)制作,并且可以表示原始网格模型的平滑特征。
还有一篇早期相关的论文,名为Paper craft models from meshes(9MB pdf),由Shatz等人撰写。
本文介绍了一种将网格分割成可开发近似形状的算法。该算法可用于CAD和计算机图形学中的各种应用。本文重点介绍纸艺,并证明该算法生成的近似形状是可开发的,易于切割并可以粘合在一起。同时还表明所给模型与纸质模型之间的误差很小。
enter image description here
来源: http://www.ee.technion.ac.il/~ayellet/images/sel-papers-pic-5.jpg

我需要这个将网格的纹理空间展开到图集中。你就是我的救星。 - Mads Elvheim

10

这些算法eed3si9n提供的链接可以从复杂的几何图形生成漂亮合理的纸模网格。如果您想要像正多面体模型一样展开网格,那么这里有一种比较简单的方法可以将任何网格展开为它的立体模型。

从源网格构建一个图,其中每个面是图中的一个顶点,并且如果两个顶点在网格中共享公共边,则它们相连。其中一个图表示不能展开的网格,当且仅当它没有环,即它是一棵树。

好的树代表了到达起始点最远面的最少折叠线,因为每次折叠都代表着在完成的模型中会积累误差。Dijkstra算法在这里很有效,但最小生成树不适用。由于每条边都被同等权重,所以所有树都是最小生成树,甚至会将您的网格展开成一个大螺旋形。当您粘贴模型时,错误将不断积累,直到最后几个面完全无法适配。

一旦有了树,首先在原点处绘制起始面。然后沿着树行走,通过计算新顶点作为两个圆的交点并将其添加到新的面上。制表位置对应于原始网格中存在但不在可展平树中的边。

用户指定的剪切可以在树步骤之前作为边缘删除处理。

展开四面体的图示

这种技术的一些缺点是,它会在平面模式下创建重叠部分,并且它取决于找到一个好的起始面。我尝试使用 Floyd-Warshal 找到最小直径面开始,但它的 O(n^3) 行为使咖啡时间过长。可以通过将树的该分支标记为“不完整”,跳过它并再次在所有不完整的面上运行算法来处理重叠部分。


好的答案,谢谢!从你的回答中并没有明确表示你打算删除边缘直到图形变成树形结构,但这似乎是暗示。我假设最小生成树算法是适当的。此外,你的答案暗示你之前写过这个 - 是个人项目还是可以在某处获取? :) - Nick Johnson
实际上,最小生成树不起作用,因为它不能最小化从中心点开始的折叠次数。我已经更新了我的答案以澄清这一点。至于从网格中删除边缘的问题,该算法不会修改原始网格。我发现更容易的方法是从头开始生成平面网格,而不是在分割边缘时保持所有正确的不变量。最后,我确实曾经将其编写为Blender插件,并打算发布它,但在完成选项卡部分之前被分心了。我将从我的旧硬盘中获取它并发布。 - Theran
1
@Theran,你是如何生成那些漂亮的图像/图表的? - Jason

0

我知道这不是一个答案,但它与此相关。前SGI图形专家Paul Haeberli的Lamina程序是解决此问题的方案。


2
哇,这是一个不错的程序,但是$353对于纸艺来说有点贵了。 ;) - Nick Johnson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接