我想到了一个三角形细分,目的是随着时间的推移平滑三角剖分(不弹出)。我认为该方案很可能已经发明并且有名称,但我似乎找不到。

细分基于三角形边缘。对于每个长于某个阈值的边缘,例如显示的距离为1厘米(即投影空间),该边缘会得到两个新点,彼此之间的距离为阈值距离(1厘米)。这样,新点之间的边就完成了,不需要进一步细分。因此,该细分最多可创建六个新点,但它可能只是一个边缘而产生两个新点。从这些点形成三角形,然后递归执行细分,直到所有边缘都短于阈值。

沿着边缘创建两个点,相隔一个阈值对于细分随着时间的推移变得平滑非常重要。 。我看不到Loop或Catmull Clark这样做。

我应该提到我已经成功地将其用于极坐标投影中的笛卡尔网格。严格说来,沿一条边创建的两个点可能在原始投影线上,也可能不在原始投影线上。

它叫什么?

解释

所以我想我必须解释极坐标投影中的笛卡尔坐标系。

极坐标系的一个很好的例子是平坦的地球。在笛卡尔系统中,地球可能看起来像这样,上面有一个巨大的桌子:


极坐标系可以将x轴定义为从地心到地球的夹角。给定用于投影地球的平面的直角坐标。 y轴就是从地面到地面的高度,或者是到地球中心的距离。根据我的描述,上面图像的极地投影版本看起来像这样(假设地球是球形的,但不是...):



(请耐心等待我成为一名出色的艺术家。)

您现在可以看到桌子已经弯曲了,因为桌子中间比地球边缘更靠近地球中心(夸张了,我知道)。

如果不进行细分,极地视图中的桌子仍将是平坦的,其高度会引起误解。在极坐标视图中,笛卡尔坐标中位于表格顶部的点对象可能在其下方。三角形细分的目的是减少误差,直到“足够小”为止。我用显示器上的预计长度来测量它,因为它便宜并且与我的质量要求有很好的对应关系,但是其他方案也可以根据极性特性做得更好或更好,例如

您可能会发现误差越大,物体越大,并且它离极地越近。

了解算法的一些细节。

这是一个三角形(在笛卡尔坐标中),红色和绿色的边在极坐标图中较长,即红色与极坐标的原点非常接近,绿色不是那么近,黑色却很远:



这就是三角形的形成方式:



一旦创建了新点,它们的笛卡尔坐标就是沿着原始边的坐标。新的三角形再次馈入算法,并重复进行直到误差足够小为止。在上图中,人们可能会怀疑红色边缘应该再划分至少一次。保证将两个相邻的三角形(或与此相关的线)分开将新点放置在具有完全相同信息的完全相同位置上。

此处的关键功能是新三角形不会与原始三角形的中间交叉,否则会导致从一帧到另一帧的纠错过多,因为最大的误差在控制点之间的中间。接近控制点的点将得到最少的校正,从而使校正量最少,以使误差足够小。这对于平滑地缩放任何轴或什至是投影对象的运动都是至关重要的。

无论什么边长,三角剖分布局都是稳定的。

宽度优先如果细分受时间或内存限制,则递归是更好的方法,因为即使对于中断的/部分细分,也可以保证边缘匹配。

评论

有关您的意思的一些图表或屏幕截图可能会有所帮助。当您说两个新点相隔一个阈值时,是否表示它们沿边缘的间距不均匀?我不太了解这对时间稳定性有什么帮助。

听起来有点像漫游,但很难说... youtube.com/watch?v=PPjWW8uPp3o

@NathanReed添加了更多说明和图片。

@AlanWolfe我想说算法在同一个球场,但有一些区别。好发现:-)

#1 楼

除了应该细分直到达到屏幕上的特定边缘长度之外,您还应该查看Michael Bunnell撰写的GPU Gems 2文章“带有置换贴图的细分曲面的自适应细分”。它使用边缘平整度测试来自适应地对几何形状进行细分,从而在相同数量的三角形的情况下获得更好的质量。

使用当前的自适应细分策略,您最终将不得不分割平面,这不必要地增加了三角形计数。这对GPU尤其不利,因为它会增加生成的微三角形的四边形透支。

关于您的细分方案名称的问题,我不认为它有特定的名称,但它只是下降了在更通用的“自适应镶嵌”下。

评论


$ \ begingroup $
是的,答案有点草率,添加了一些修改
$ \ endgroup $
–JarkkoL
16年11月7日在4:42

$ \ begingroup $
您最近给出了很多详细的答案,以至于我猜想您对此可以说的更多。 +1
$ \ endgroup $
– trichoplax
16年7月7日在11:16

$ \ begingroup $
“使用当前的自适应曲面细分策略,最终将导致平面分裂,这不必要地增加了三角形数。” -恰恰相反。我猜您(和许多其他人)不知道什么是极坐标系,以及如何根据投影位置对笛卡尔3D模型进行扭曲。我确实同意您的观点,阈值可能比显示的长度更复杂,但要推导出它却变得困难。而且除了我的目标GPU还没有镶嵌功能。我将在稍后的内容中提供更多信息来更新我的答案。
$ \ endgroup $
–安德烈亚斯(Andreas)
16年11月12日在10:01