几何构型基础-曲线与曲面-01-Bézier曲线与曲面技术分享

本文探讨了CAD软件中几何文件的BREP表达形式,重点介绍了Bézier曲线和曲面在参数化设计中的关键作用,包括它们的定义、性质和在计算机图形学中的应用。同时,对比了Bézier曲线/曲面的优点和局限性,如直观设计、数学性质和计算负担等。
摘要由CSDN通过智能技术生成

1.

问题的引入

在CAD软件模型设计阶段,产出基于连续函数的模型描述文件,即几何文件。不同标准及厂商支持的几何内容均有所区别,整体上常用几何描述文件均支持BREP表达的形式。

在几何描述文件中不只有参数化数据、几何形状、它们的拓扑关系,根据格式不同还可能有材料、属性等信息,本文仅讨论几何文件中构成几何实体的形状、形状的参数化数据中Bézier曲线与曲面部分。

2.

相关概念

BREP表达(Boundary Representation)在BREP表达即边界表示法中,一个复杂的三维形状被描述为一组顶点(vertices)、边(edges)、面(faces)以及它们之间的拓扑关系,其核心思想是通过精确描述实体模型的边界来完整表示复杂的几何形状。

拓扑关系:除去几何元素本身,BREP表达中还包括它们之间的连接关系,如哪些边属于哪个面,哪些面构成了一个体等。

可以看到BREP表达中,顶点、边、面是几何表达的基础。顶点是三维空间中的点,是几何最基础的单元。边则是由两个或多个顶点定义的一维元素,可以是直线或曲线。面是闭合的二维元素,可以是平面或多边形,也可以是复杂的曲面,如Bézier曲面和NURBS曲面等。

BREP表达基础中除去顶点、直线、平面、多边形等简单情况,表达基础中的复杂和重点可以归结为曲线和曲面的表达。(这里只关注基于顶点、边、面向下分类构成情况,不考虑基于一系列相连的面组成区域构成壳,由壳围成三维实体的向上拓扑)

目前最常见的几何交换格式包括STEP/STP、IGES/IGS、SAT、x_t、STL、obj等,其可大体分为两类,一类是支持BREP表达的STEP/STP、IGES/IGS、SAT、x_t等;另一类则是以STL、obj等为代表基于三角面片的几何表达。

3.

计算机中对曲线/曲面的描述要求

当进行曲线/曲面绘制时,人们所期望的曲线/曲面所具备的性质为:光滑、连续、描述简单、可由较少参数来进行曲线/曲面形状控制。其中光滑、连续是人们所需的曲线/曲面性质,而描述简单、可由较少参数来进行曲线/曲面形状控制是计算机基于性能消耗要求提出的性质。

而Bézier曲线和Bézier曲面是一种符合上述要求,在几何表达中应用相对广泛的描述形式。

4.

Bézier曲线

Bézier曲线在计算机图形学中相当重要的参数曲线,它能够通过曲线上的控制点来创建和编辑曲线。

贝塞尔曲线的一次、二次、三次表达式如下: 

图片

其中P0、P1...点为Bézier曲线上的控制点,t的参数区间为0到1,相应贝塞尔曲线的通用公式如下:

图片

对通用Bézier曲线按照求和项进行基函数拆解,可拆解为n+1项基函数,以三次Bézier曲线为例,其拆解的基函数曲线如下图所示。

图片

 从基函数曲线上我们可以看到,除去0和1位置外,所有的基函数曲线的取值均大于0。这也彰示了Bézier曲线的特点,即除去曲线两侧的端点外,曲线上任意一点的位置受所有控制点的共同影响。

进行Bézier曲线采样点计算的python代码如下所示。

import numpy as npimport math
class BezierCurve:    def __init__(self,ctrlPts,sampleNum = 100) -> None:        """初始化贝塞尔曲线
        Args:            ctrlPts ([[float,float,float]/[float,float],]): 控制点坐标,二维或三维点            sampleNum (int, optional): 曲线上参数空间均匀采样点个数. Defaults to 100.        """        self.ctrlPts = ctrlPts        self.sampleNum = sampleNum
        # Bezier曲线阶数为点的个数 - 1        self.k = len(ctrlPts) - 1
    def basicFunction(self,i:int,t:float)->float:        """计算第i个k阶贝塞尔曲线在t处的基函数值
        Args:            i (int): 当前控制点索引            t (float): 自变量t,在[0,1]区间内
        Returns:            float: 基函数值        """        return math.comb(self.k, i) * t**i * (1 - t)**(self.k - i)        def update(self):        """启动计算Bezier曲线上的采样点        """        samplePts = []
        # 构建控制点,基函数向量        ctrlPts = np.array(self.ctrlPts)        Basics = np.zeros((len(self.ctrlPts),1))                # 在区间内离散点,计算相应控制点序号的基函数        for t in np.linspace(0,1,self.sampleNum):            for i in range(len(self.ctrlPts)):                Basics[i,0] = self.basicFunction(i,t)            point = ctrlPts.T @ Basics            samplePts.append(point)        return samplePts

通过采样点连线的方式,可以得到二维和三维Bezier曲线的可视化图形。通过修改采样点,可以控制Bezier曲线的形状。

Bezier3_3D

如视频所示,在四个控制点描述的三阶Bezier曲线中,调整第二个控制点的位置,除去曲线端点外,曲线整体形状均跟随控制点变化。

5.

Bézier曲面

Bézier曲面的定义公式如下:

图片

其中Bm,i (u)和Bn,j(v)是基函数,Pi,j为控制点,可以简单理解为两个Bézier曲线的乘积。其中i为u方向控制点序列,j为v方向控制点序列,m+1为u向控制点个数,n+1为v方向控制点个数。

基于Bézier曲线代码和Bézier曲面定义,可以很容易地推导出Bézier曲线在u、v方向取样后点曲面采样点位置,Bézier曲面采样点计算代码如下:

import numpy as npimport math
class BezierSurface:    def __init__(self, m : int, n : int, ctrlPts, uSampleNum : int = 100, vSampleNum = 100) -> None:        """Bezier曲面初始化
        Args:            m (int): u向Beizer基函数阶数            n (int): v向Beizer基函数阶数            ctrlPts ([[float,float,float],]): Bezier曲面控制点列表,控制点个数应为(m+1)*(n+1)            uSampleNum (int, optional): u向离散点个数. Defaults to 100.            vSampleNum (int, optional): v向离散点个数. Defaults to 100.        """        self.m = m        self.n = n        self.ctrlPts = ctrlPts        self.uSampleNum = uSampleNum        self.vSampleNum = vSampleNum
    def basicFunction(self, i:int, k:int, t:float) -> float:        """计算第i个k阶贝塞尔基函数Bi,k(t)
        Args:            i (int): 当前控制点索引            k (int): Bezier曲线阶数            t (float): 自变量t,在[0,1]区间内        """        return math.comb(k, i) * t**i * (1 - t)**(k - i)      def update(self):        """基于用户设置计算Bezier曲面上的离散点        """        #贝塞尔曲面上的离散点        samplePts = []                #选择u向,v向贝塞尔函数,由于这里只需要用Bezier基函数计算,故                ctrlPts = np.array(self.ctrlPts)                for u in np.linspace(0,1,self.uSampleNum):     # u 方向自变量            for v in np.linspace(0,1,self.vSampleNum): # v 方向自变量                point = [0,0,0]                          # 在 u 向 v 向 值为 u,v时的离散点                for i in range(self.m + 1):          # u 方向控制点序号                    for j in range(self.n + 1):      # v 方向控制点序号                        BasicU = self.basicFunction(i,self.m,u)                        BasicV = self.basicFunction(j,self.n,v)                        index = i * (self.m + 1) +  j                        controlPoint = ctrlPts[index]                        point += BasicU * BasicV * controlPoint                samplePts.append(point)        return samplePts

计算时在数字空间的u、v方向上进行离散,在u、v方向各步进一个采样步情况下,会得到下图所示左侧四个参数空间上的点。代入Bézier曲面公式,可得到对应三维空间的四个点。三维空间上四个点在大多数情况是不在同一平面的,因此采用对角连线形成两个三角形来表征该曲面最小单元,这里选择P1、P3连线还是P2、P4连线需通过Delaunay三角剖分的空圆特性来进行判定。

图片

通过以上方式处理当前参数曲面的所有曲面最小单元,可以得到一个三角面片表征的曲面。这也是很多几何引擎除去支持BREP表征几何外,还支持基于三角面片几何表征的原因。

为验证Bézier曲面的特点,在XOY平面构建如下5*5矩阵作为曲面的控制点,控制点矩阵初始值如下图所示。

图片

选中矩阵中间点作为[0,0,0]作为曲面上位置发生变化的点,将其Z坐标按照从0.0到10.0以1为步进量进行设置,可以得到11个参数化曲面。将此11个参数化曲面输出为stl文件,导入FastCAE后处理后,可得到如下曲面动画。

Bezier曲面

从视频中可以看到在Bezier参数曲面中,在选中控制点不是边缘点时,除去边缘点外,其余曲面上的点坐标都会跟随变化的控制点坐标而变化。(可参见第一帧与其他帧基于空圆特性的三角拓扑变化,该变化同样表征了这一特性)

6.

优点与劣势

完成了参数化Bézier曲面的计算和构建过程后,来了解下Bézier曲面的性质,相较于其他在几何构型时使用的参数化曲面(如B样条、NURBS等),Bézier曲面优劣如下:

优点:

  • Bézier曲面是由一组控制点完全决定的,设计师可以直接通过修改控制点位置来直观地改变曲面形状,具有很强的直观性和设计自由度。

  • Bézier曲面第一和最后一阶Bézier曲线会通过控制多边形的起始和结束点,这对某些需要精确边界条件的应用场景非常有利。

  • Bézier曲面具有良好的代数和几何性质,是由Bernstein基多项式生成的,便于数学分析和编程实现。

  • 在Bézier曲面中可以构建嵌套结构,形成所谓的Bézier补片,方便构建复杂的几何模型,如通过Béziers面片拼接而成的自由形态曲面。

缺点:

  • Bézier曲面中改变一个控制点坐标,除去无关边缘点外,所有点坐标都会发生变化。一些曲面建模中,通常会有曲面中部分区域符合建模要求,只需调整曲面其他部分情况,这种情况Bezier曲面是无法胜任的。

  • 对于高阶Bézier曲面,需要大量的控制点才能精确描述复杂的形状,这增加了计算机数据存储和计算的负担。

  • Bézier曲面不能像NURBS那样通过权重因子灵活控制曲面的弯曲和平坦区域,也不容易表达锥面、柱面等具有极点或尖锐转折点的曲面。

  • Bézier曲面在拼接时,如果两曲面的控制点布局不一致,可能导致曲面在交界处产生不连续性,影响整体外观质量和制造精度。

Bézier曲线也与曲面具有类似的特征,基于Bézier曲线/曲面的特征,在进行几何描述中最常用的Bézier曲线/曲面为三阶Bézier曲线/曲面。

(全文完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FastCAE2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值