鉴于我已经在C中实现了一个名为calc_bspline_surf()的函数,并且该函数具有以下声明:坐标可以通过调用函数{u, v}生成。

这是一种解决方案,可以在两个方向上均匀地采样3D点/>
但是,我需要采样多少个3D点?有经典的样本策略吗?

评论

您的问题标题似乎提出的问题与正文不同。那是什么呢?如何采样点或需要采样多少?

@joojaa对不起,我的描述不清楚。我的问题源于这个问题。例如,在Mathematica中,我可以使用ParametricPlot3D [f [x,y],{x,0,1},{y,0,1}]绘制B样条曲面。

正如joojaa所指出的,标题中的问题与其余问题不同。您是要仅均匀采样,还是仅调整样本大小,还是对以不同方式进行采样感兴趣,以减少所需的点数?

@trichoplax显然,均匀采样不是一个好方法。我的困惑是是否存在有关采样3D点和B样条曲面可视化的专门算法。请查看此屏幕截图

#1 楼

根据您所链接的问题,问题似乎在于您在曲面的高度弯曲区域中没有得到足够的样本。您可以在任何地方增加采样密度,但是对平坦区域进行过度采样会变得太慢。

因此,您需要在需要的区域局部增加采样密度。一个概念上简单的算法是自适应优化。您将从紫外线空间中的均匀样本网格开始。然后,检测曲率对于网格间距而言过高(超过某个阈值)的网格正方形,然后对其进行细分,在现有的两个正方形之间添加其他样本。可以在新的较小的网格正方形上递归地重复此过程,并根据曲面的需要进行细分。您可以调整曲率阈值,以在保真度和性能之间取得平衡。

由于B样条(NURBS)基于有理函数,我想可以找到一个区域中的最大曲率(或至少有界)。如果可能的话,这将是理想的,因为这样可以避免在没有任何初始网格点落入的情况下丢失小的高曲率区域的问题。但是,在紧要关头,可以通过查看已评估的采样点来估算曲率。例如,如果$ p_1,p_2,p_3 $是在UV空间中共线的三个采样点,则如果对曲面进行了充分采样,它们也应接近共线。因此,您可以例如评估
$$$ frac {\ | p_2-p_1 \ | + \ | p_3-p_2 \ |} {\ | p_3-p_1 \ |} $$
,其中双杠表示矢量长度。如果该值大于某个阈值(例如1.1或1.5)(请注意1.0会完全平坦),则可以细分这些点之间的面积。

评论


$ \ begingroup $
大多数软件都将弦高定义为细分标准,并附带角度误差(这就是您所描述的...)。原因是通常在工程解决方案中,公差通常是对真实表面的挠度,而不是保持曲率的程度。但是,有许多方法可以使鱼脱脂,从而满足您的需求。简单的UV划分可能不利于多修补/修剪的表面。
$ \ endgroup $
– joojaa
16年8月8日在4:29