我试图找到(或可能创建)给定2D轮廓的平滑,圆形3D网格的算法。我正在尝试通过Gamecube游戏Amazing Island重新创建一个系统,您可以在此处看到一个示例。我尝试做的一个更现代的示例是Paint 3D中的Soft Edge 3D Doodle工具。转换成3D网格。结果应该具有光滑,弯曲,有点有机的边缘,而不是简单地将形状挤压成棱柱。可以假定每个形状都是简单连接的(意味着不可能有穿过它们的孔的形状),并且可以假定轮廓不会自相交。如果我能找到一种具有非简单连接形状的方法,那就太好了,但这不是必须的,而且看起来会变得更加复杂。

寻找如何绘制轮廓并将其三角剖分以制作平面2D网格。我对如何接受它并将其变成我想要的东西一无所知。我可以获得代表轮廓顶点的点列表,这似乎应该是第一步。

我正在C#中用Unity实现这一点,但不一定代码。对算法的描述,甚至对我如何解决问题的好主意,都将是很棒的。谢谢您的宝贵时间。

#1 楼

一种对此非常有用但很难实现的算法是找到形状的中间轴,然后根据与中间轴的正负号距离获得各种轮廓。您也可以使用“直形骨架”而不是“中间轴”,但计算起来也有些麻烦。 ://steamcdn-a.akamaihd.net/apps/valve/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf。您可以绘制用户绘制的形状的位图,将其缩小到可管理的大小,计算每个像素到形状边缘的距离,然后将其缩放到所需的大小(并相应缩放距离)。签署距离后,便可以将它们与上述相同的3D轮廓使用。例如,显示的视频中的枕头基本上是正方形的。您的3D轮廓将在正方形边缘处将正面高度设置为0,并在您向中心移动时增大到最大,在短距离内达到峰值并保持到中心。背面高度将相同,但方向相反。

评论


$ \ begingroup $
中间轴比直线骨架更容易计算,直线骨架的边缘情况是一场噩梦!
$ \ endgroup $
–Felipe Gutierrez
19/12/4在23:04

#2 楼

您可以尝试使用FiberMesh技术。 Fibermesh采用3D输入曲线并将其解释为表面轮廓。然后,使用优化技术创建光滑的表面。在这里您可以看到一个视频,演示了该技术。