计算机图形学曲线和曲面造型_第1页
计算机图形学曲线和曲面造型_第2页
计算机图形学曲线和曲面造型_第3页
计算机图形学曲线和曲面造型_第4页
计算机图形学曲线和曲面造型_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

曲线和曲面造型 第三专题 计算机图形学 曲面造型 SurfaceModeling 是计算机辅助几何设计 ComputerAidedGeometricDesign CAGD 和计算机图形学 ComputerGraphics 的一项重要内容 主要研究在计算机图形系统中对曲面的表示 设计 显示和分析 曲面造型起源于汽车 飞机 船舶 叶轮等的外形放样工艺 由Coons Bezier等大师奠定其理论基础 如今已形成了以有理B样条曲面 RationalB splineSurface 参数化特征设计和隐式代数曲面 ImplicitAlgebraicSurface 表示这两类方法为主体 以插值 Interpolation 拟合 Fitting 逼近 Approximation 这三种手段为骨架的几何理论体系 一 曲面造型的发展 1964年美国麻省理工学院的Coons提出给定封闭曲线的四条边界定义一块曲面的的曲面描述方法 这种方法存在形状控制与连接问题 1971年法国雷诺汽车公司的Bezier提出一种由控制多边形设计曲线的新方法 该方法简单易用 而且解决了整体形状控制问题 为曲面造型的进一步发展奠定了坚实的基础 Bezier方法仍存在连接问题和局部修改问题 1974年提出了B样条方法 该方法继承了Bezier方法的一切优点 克服了Bezier方法存在的缺点 较成功地解决了局部控制问题和连接问题 从而使自由型曲线曲面形状的描述问题得到较好解决 不能精确表示圆锥曲线及初等解析曲面 造成了产品几何定义的不唯一 曲线曲面没有统一的数学描述形式 容易造成生产管理混乱 1975年以来美国Syracuse大学的Versprille首次提出有理B样条 NURBS 方法 后来Piegl和Tiller等人的功绩 使NURBS方法成为现代曲面造型中最为广泛流行的技术 NURBS方法可以精确地表示二次规则曲线曲面 实现了用统一的数学形式表示规则曲面与自由曲面 具有可影响曲线曲面形状的权因子 使形状更宜于控制和实现 NURBS方法是非有理B样条方法在四维空间的直接推广 多数非有理B样条曲线曲面的性质及其相应算法也适用于NURBS曲线曲面 国际标准化组织 ISO 于1991年颁布了关于工业产品数据交换的STEP国际标准 将NURBS方法作为定义工业产品几何形状的唯一数学描述方法 从而使NURBS方法成为曲面造型技术发展趋势中最重要的基础 计算机图形显示 真实性 实时性 交互性 几何设计对象 多样性 特殊性 拓扑结构复杂性 制造工业 一体化 集成化 网络化 激光测距扫描 三维数据采样技术及硬件设备完善 曲面造型研究的开拓创新 曲面变形 曲面重建 曲面简化 曲面转换 曲面等距性 基于网格细分的离散造型 曲面造型的发展趋势 二 曲线和曲面的理论基础 2 1曲线的参数表示 曲线的参数方程 给定一个t值 就得到曲线上一点的坐标 当t在参数域 a b 内连续变化时 就得到了曲线 为了方便起见 可以将 a b 区间规范化成 0 1 曲线参数表示矢量方程式 给定一个t值 就得到曲线上一点的坐标 当t在参数域 a b 内连续变化时 就得到了曲线 为了方便起见 可以将 a b 区间规范化成 0 1 螺旋线的参数方程可以写为 或 曲线参数方程实例 2 2曲面的参数表示 双参数描述表达式 矢量方程式为 当参数u v在参数域 0 1 中连续变化时 其对应点 就形成一张曲面 向线称为曲面的参数曲线 等参数线 u v分别等于0 1时的参数曲线 2 3曲线曲面的参数连续 在几何造型设计中 单一的曲线往往难以描述复杂的形状 形状复杂的曲线常采用若干段曲线组合而成 相邻的曲线段间的连接则满足某种连续性条件 如果参数曲线有n阶连续的导矢 则称该曲线为Cn或n阶连续 一般来说 如果曲线连续的阶数越高 那么曲线就越光滑 在几何上 C0 C1 C2依次表示曲线的位置 切线方向 曲率连续 对于组合曲线 整条曲线的参数连续性取决于公共连接点的连续性 如果在公共连接点达到k阶参数连续 则称该曲线具有Ck或k阶参数连续性 2 4曲线曲面的几何连续 曲线具有切向连续但不一定具有C1连续 具有曲率连续但不必一定具有C2连续 参数连续是对参数曲线连接光滑程度的过分限制 不能准确客观地反映参数曲线连续的光滑程度 引入了称为视觉连续性的几何连续性 K阶几何连续用GK表示 若两曲线段在公共连接点处具有公共的单位切矢 即关于弧长的一阶导矢 则称它们在该点处具有一阶几何连续或G1连续性 若在该点处又具有公共的曲率矢 即关于弧长的二阶导矢 则称它们在该点处具有二阶几何连续性式G2连续 2 5Bezier曲线 n次Bezier曲线用给定n 1个控制顶点D0 D1 Dn的表达式 由控制顶点D0 D1 Dn构成的多边形称为Bezier曲线的控制多边形 又称为特征多边形 2 6Bezier曲面 给定个空间上顶点 次Bezier曲面定义为 2 7B样条曲线 给定n 1个控制顶点 k次B样条曲线表示为 移动定点对B样条曲线的影响 k次B样条曲线与k 1个顶点有关 2 8B样条曲面 可以利用u v两个不同参数方向上的B样条曲线构成张量积B样条曲面 一张B样条曲面由一组特征多边形网格或特征网格定义 给定了 个控制顶点 又分别给定参数u与v的次数k与l 和两个节点矢量 和 则k l次张量积B样条曲面表示为 其中 分别为n次和m次B样条曲线的基函数 构成的控制网格称为B样条曲面的特征多边形网格 可以用B样条的递推公式决定 由 2 9非均匀有理B样条 NURBS 曲线和曲面 非均匀有理B样条 Non UniformRationalB Spline 简称为NURBS NURBS方法在CAGD领域获得了广泛的应用 在国际标准组织 ISO 颁布的工业产品几何标准STEP 规定自由曲线 曲面用NURBS表示 在CAD CAM领域 NURBS方法最重要的优点是其统一描述自由曲线 曲面和初等曲线 曲面的能力 因而 当几何形体同时存在自由曲线曲面和解析曲线曲面时 应用NURBS方法最为有效 2 9 1NURBS曲线 k次NURBS曲线方程用分段的有理多项式函数表示 k次NURBS曲线方程用有理基函数表示 式中 称为k次有理基函数 具有和k次B样条基函数相同 的性质 式中 分别与 首 末权因子 为由节点矢量 节点矢量中的节点数为m n k 1 n为控制点数 k为B样条基函数的次数 决定的k次B样条基函数 控制顶点 相联系 权因子 2 9 2NURBS曲面 式中 控制顶点网 权因子 v向节点矢量 沿v向的l次B样条基函数 沿u向的k次B样条基函数 u向节点矢量 u v Nurbs曲线数据结构图 Nurbs曲面数据结构图 2 9 3NURBS曲面的数据结构 曲线 曲面数据结构的编程实现 该曲线 曲面数据结构均为双链表结构 并且链表内还包括若干个双链表 控制点链表 节点链表等 采用VC 指针类型的集合样板类实现这种双链表结构 使得对链表中节点的插入 删除和修改非常直观 classCurve public intCurveNo 曲线号 intk 曲线次数 ControlPoint CP 控制点指针 KnotVector KV 节点矢量指针 classControlPoint public intVertexNo 控制点序号 doubleVertex 3 控制点坐标 doubleWeight 控制点权因子 public voidFormatControl CString str classKnotVector public intKnotNo 节点序号 intMultiplicity 节点重复度 doubleKnotValue 节点值 public voidFormatKnot CString str VC 写的NURBS曲线数据结构 classSurface ControlPoint Up ControlPoint Vp KnotVector KU KnotVector KV VC 写的NURBS曲面的数据结构 控制点 节点的可视化实现 为实现对控制点 节点链表实时进行插入 删除和修改等操作 可将这些操作同对话框联系起来 并通过操作对话框上的控件 实现对控制点 节点链表实时插入 删除和修改等操作过程的可视化 利用VC 实现控制点链表的插入 删除和修改等操作过程的可视化的过程如下 2 建立与对话框相联系的类CmodifierVertex 同时编写与按钮相关的成员函数OnAdd OnInsert OnUpdate OnRemoveAt 和OnRemoveAll 1 建立如图1所示的对话框 对话框中有按钮Add Insert Update RemoveAt RemoveAll 可对控制点链进行操作 有组合框可显示控制点链表中的数据 3 将控制点链表中的数据在组合框中显示出来 voidCModifierVertext OnAdd TODO Addyourcontrolnotificationhandlercodehereif UpdateData TRUE return ControlPoint pControl newControlPoint pControl VertexNo m VertexNo pControl Vertex 0 m Vertexx pControl Vertex 1 m Vertexy pControl Vertex 2 m Vertexz pControl Weight m Weight ControlPoint List AddTail pControl AddToListBox pControl 将数据添加到组合框 添加操作的程序设计实例 三 OpenGL基本程序框架 OpenGL三维图形标准是由AT T IBM DEC SUN HP Microsoft和SGI等多家公司在GL图形库标准的基础上联合推出的开放式标准 它的出现彻底改变过去只能依赖于价格昂贵的图形工作站及复杂的三维图形软件从事三维图形计算机应用的历史 使广大程序员能够在PC机上用C语言开发出复杂的三维图形 由于OpenGL具有跨平台性 简便 高效 功能完善 目前已经成为三维图形制作中事实上的工业标准 它不仅提供了绘制点 线 多边形等基本形体的函数 还提供了绘制复杂三维曲线曲面和三维形体的函数 由于OpenGL在进行几何建模时是以顶点为图元 由点构成线 再由线及其拓扑结构组成多边形曲面 因此应用OpenGL提供的建模函数可构造出几乎所有的三维模型 OpenGL的作用机制 OpenGL的作用机制是客户 Client 服务器 Server 机制 客户 用OpenGL绘制图形的应用程序 向服务器 OpenGL内核 发送OpenGL指令 由服务器负责解释执行这些命令 OpenGL图形库被封装在动态连接库opengl32 dll内 在使用时从客户应用程序发出的对OpenGL接口函数的调用首先被opengl32 dll处理 然后传送给服务器并由Winsrv dll做进一步处理后传给Win32DDI DeviceDriversInterface 设备驱动接口 最后把处理过的图形命令送给视频显示驱动程序完成最终的显示 由于OpenGL的辅助库函数对于自由曲线曲面的绘制提供有NURBS编程接口 因此使用起来比较简单 使用OpenGL之前 必须通过初始化代码对其进行初始化 并定义像素的存储格式等信息 客户 Client 用OpenGL绘制图形的应用程序 服务器 Server OpenGL内核 发送OpenGL指令 解释执行命令 OpenGL图形库 动态连接库opengl32 dll 对OpenGL接口函数的调用 设备驱动接口 DeviceDriversInterface 图形命令 显示 NURBS编程接口 NURBS程序 OpenGL的作用机制 PIXELFORMATDESCRIPTORpixelDesc 像素存储格式化 对结构变量进行了填充 pixelDesc nSize sizeof PIXELFORMATDESCRIPTOR pfd的大小pixelDesc nVersion 1 版本号pixelDesc dwFlags PFD DRAW TO WINDOW 支持窗口PFD SUPPORT OPENGL 支持OpenGLPFD DOUBLEBUFFER 支持双缓存pixelDesc iPixelType PFD TYPE RGBA RGBA类型pixelDesc cColorBits 32 32位色深度pixelDesc cRedBits 8 各颜色位pixelDesc cRedShift 16 pixelDesc cGreenBits 8 pixelDesc cGreenShift 8 pixelDesc cBlueBits 8 pixelDesc cBlueShift 0 pixelDesc cAlphaBits 0 无alpha缓存pixelDesc cAlphaShift 0 忽略转换位pixelDesc cAccumBits 64 各累计位pixelDesc cAccumRedBits 16 pixelDesc cAccumGreenBits 16 pixelDesc cAccumBlueBits 16 pixelDesc cAccumAlphaBits 0 pixelDesc cDepthBits 32 32位深度缓存pixelDesc cStencilBits 0 无模版缓存pixelDesc cAuxBuffers 0 无辅助缓存pixelDesc iLayerType PFD MAIN PLANE 主层pixelDesc bReserved 0 保留pixelDesc dwLayerMask 0 pixelDesc dwVisibleMask 0 pixelDesc dwDamageMask 0 设置一个线程的当前绘图描述表wglMakeCurrent hDC m hGLContext 对自由曲线曲面的绘制DoNURBS 释放绘图描述表wglMakeCurrent hDC NULL 释放RC 一般在WM DESTORY消息响应函数OnDestory 中进行 wglDeleteContext m hGLContext 至此 一个基于OpenGL的基本程序框架构造完毕 具体对自由型曲线曲面的构造工作在DoNURBS 中完成 在绘制自由曲线曲面之前用wglCreateContext 创建一个渲染上下文RC并将其作为参数 通过wglMakeCurrent 来建立一个当前的绘图描述表 并在绘制完毕后将其释放 OpenGL绘制自由曲线曲面 OpenGL的一个很大的优点就是在构造光滑曲线和曲面时只需少量控制点就完成精确描述 而不必靠大量的基本图元去拟合 NURBS是B样条的扩展 用OpenGL的NURBS编程接口绘制自由曲线曲面只需预先对节点序列和控制点进行定义即可完成对NURBS样条的精确描述 节点序列GLfloatNotes 8 0 0f 0 0f 0 0f 0 0f 1 0f 1 0f 1 0f 1 0f 定义控制点for inti 0 i 4 i for intj 0 j 4 j LinchpinPt i j 0 GLfloat 3 0f i 0 5f LinchpinPt i j 1 GLfloat 3 0f j 0 5f if 0 i 使用OpenGL提供的NURBS编程接口进行编程比较简洁 首先创建一个NURBS曲面对象并根据需要对其属性进行设置 在调用了gluBeginSurface 或是gluBeginCurve 后就可以根据前面定义的控制点对其曲线曲面进行绘制了 绘制完毕后以gluEndSurface 或gluEndCurve 结束 创建NURBS曲面对象Nurb gluNewNurbsRenderer 设置NURBS曲面对象属性gluNurbsProperty Nurb GLU SAMPLING TOLERANCE 30 0f gluNurbsProperty Nurb GLU DISPLAY MODE GLU FILL 开始NURB区间绘制gluBeginSurface Nurb 定义NURBS曲面的形状gluNurbsSurface Nurb 8 Notes 8 Notes 4 3 3 其中gluNurbsSurface 是定义NURBS曲线曲面的关键函数 其函数原型定义如下 voidgluNurbsSurface GLUnurbsObj nobj NURBS曲面对象GLintsknot count u方向节点数目GLfloat sknot u方向节点数组指针GLinttknot count v方向节点数目GLfloat tknot v方向节点数组指针GLints stride u方向控制点数据跨度GLintt stride v方向控制点数据跨度GLfloat ctlarray 控制点数组指针GLintsorder u方向上多项式阶数GLinttorder v方向上多项式阶数GLenumtype 确定求值器类型 另有gluNurbsCurve 函数也可用于NURBS曲线曲面的定义 使用方法与之类似 光照和材质的渲染 为更真实地对实体进行三维建模 需要对已构造成型的自由型曲线曲面进行光照和材质上的渲染 OpenGL对此提供有一系列的用于建立光照模型的库函数 使用户可以很方便地在三维场景中建立所需的光照模型 OpenGL中的光照模型由环境光 AmbientLight 漫射光 DiffuseLight 镜面反射光 SpecularLight 等组成 同时还可设置光线衰减因子来模拟真实的光源效果 GLfloatLight position 1 0f 1 0f 1 0f 0 0f GLfloatLight diffuse 1 0f 1 0f 0 0f 1 0f glLightfv GL LIGHT0 GL POSITION Light position 定义光源位置glLightfv GL LIGHT0 GL DIFFUSE Light diffuse 定义光源漫射光glEnable GL AUTO NORMAL 自动生成曲面法向量glEnable GL LIGHTING 启动

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论