在3D网格中生成圆角边和角的算法

时间:2010-08-14 18:00:25

标签: algorithm 3d rounded-corners mesh

从3D网格开始,您如何为该网格的多边形之间的边和角提供圆角外观?


不希望劝阻其他方法,这就是我目前正在解决的问题:

给定正多面体的网格,我可以通过沿着平面缩放每个多边形并使用圆柱段连接边缘使网格边缘呈现圆形外观,这样每个圆柱体与每个多边形相交,并且它与该多边形相交。 / p>

以下是涉及多维数据集的示例:

Cube

这是缩放多边形后的立方体:

Cube after scaling polygons

这是使用圆柱体连接多边形边缘后的立方体:

Cube with rounded edges

我遇到的问题是弄清楚如何处理多边形之间的角落,特别是在每个角落有三个以上边缘相遇的情况下。我也喜欢一种适用于所有闭合多面体的算法,而不仅仅是那些常规的算法。

5 个答案:

答案 0 :(得分:2)

我发布此答案是因为我无法将图片放入评论中。

安定点

这是两兄弟露营的形象:

sattlepoint http://img831.imageshack.us/img831/7398/tent.png

他们把简单的帐篷放在一个陡峭的洞穴中间(这是帐篷的一个不好的地方,但那不是重点),所以每个帐篷的一端指向上方。在四个方块相遇的地方,你有一个饱和点。每个帐篷顶部的两个边缘可以正常倒圆以及两个向下边缘。但是在饱和点,你在两个方向上都有不同的曲率,因此不可能使用球体。这排除了Svante的解决方案。

<强> Selfintersection

下图显示了从侧面查看的一些3D多边形。它有些尖锐的东西,从另一侧钻了一个洞。左图显示之前,右图显示。

alt text http://img802.imageshack.us/img802/8628/selfintersection.png

从锋利的边缘移除的质量包含钻孔的末端。

这里还有其他一些东西要看。钻孔侧面可能是非常大的多边形(假设它不是一个洞而是一个狭缝)。你仍然只能在顶部获得小半径。你不能只是缩放你的多边形,你必须考虑相邻的多边形。

<强>凸

你说你只是去除质量,只有当你的几何是凸的时候才会这样。看看你发布的图片。但现在假设查看器卷内。半径远离你,因此增加质量。

<强> NURBS

我自己不是一个nurbs专家。但约束看起来像这样: nurbs补丁的角必须与缩小的多边形的角相同。拐角处的nurb表面的法向矢量必须等于多边形的法线。这应该足以保证nurb边缘将是多边形边缘之后的直线。法线还确保在多边形和nurbs补丁之间的边界处不会出现可见边。

我自己就算数学了。 nurbs只是多边形。你会有一些未知的系数和你的约束。这为您提供了一个可以解决的方程组(通常是线性的)。

答案 1 :(得分:1)

在那个角落遇见的面数是否有上限?

您可能会使用来自CAGD的概念,特别是非统一理性B样条(NURBS)可能对您有用。

您当前的方法 - 粘贴一些固定的几何图元可能太不灵活,无法解决问题。 NURBS需要一些数学工作来适应,但可能更适合您的需要。

答案 2 :(得分:1)

推断你的圆柱边缘方法,角应该是球体,分别是。球形段,与在那里相遇的圆柱体具有相同的半径,并且在圆柱体轴的交点处具有中心。

答案 3 :(得分:0)

这里我们有一个C ++标题用于生成三角形圆形3D框。代码使用C ++编写,但也易于移植到其他编码语言。此外,它很容易被修改为其他原语,如四边形。

https://github.com/nepluno/RoundCornerBox

答案 4 :(得分:0)

正如@Raymond 所建议的,我也认为 nepluno repo 提供了一个很好的实现来解决这个问题;高效简单。

为了完成他的回答,我刚刚在JS中写了一个解决这个问题的方法,基于BabylonJS 3D引擎。这个解决方案可以在这里找到,并且可以很容易地被另一个 3D 引擎替换:

https://playground.babylonjs.com/#AY7B23