当前位置: 东星资源网 > 中考资料 > 中考分数线 > 正文

[基于NURBS插值对ModelMagic3D几何建模系统的完善与开发]3D建模

时间:2019-01-14 来源:东星资源网 本文已影响 手机版

  ModelMagic3D(后面统一简称MM3D)是一款容易使用,交互方便的3D建模与仿真(动画)软件。具备制作3D模型和创建实时渲染的OpenGL场景的功能。可以利用基本的几何造型功能(包括线、面、体的基本图元)设计2D、3D 对象。然而,开源源代码专业性不强,尚有未查出的bug,运行不稳定,尤其是不能接收来自其它3D软件的包含曲面的文件。所以很有必要对几何建模系统进行完善和开发。本文主要是基于双三次NURBS曲面插值进行完善和开发。
  
  一、 NURBS曲线、曲面论基础
  
  1.NURBS数据点的参数化
  给定一组数据点,要求构造一条曲线顺序通过这些数据点,称为对为此数据点进行插值,所构造的曲线为被插曲线\[1-3\]。在采用参数多项式方法\[1-3\]进行曲线、曲面插值时,首先要对数据点进行参数化。
  对一组有序数据点决定一个参数分割,称之为对这组数据点实行参数化\[1-3\]。本文对曲线采用规范积累弦长参数化法;曲面采用双向平均规范积累弦长参数化法\[1-3\]。
  2. 由数据点插值NURBS
  (1) 节点矢量的确定
  
  很显然,此矩阵方程是标准的三对角矩阵可用成熟的追赶法\[3\]求解。
  (3) 曲面参数方向的选取
  对给定的呈拓扑矩形阵列的数据点P??ij(i=0,1,…,r;j=0,1,…,s),如果其中每行(或列)都位于一个平面内,则取插值于各行(或列)数据点的一组曲线为截面曲线,以u为参数。现设每列数据点为横向(u向)截面数据点,共有s+1个截面。适当地把它的一个方向取为横向截面参数方向,以u为参数;另一方向为纵向参数方向,以v为参数。
  
  二、 MM3D几何建模模块的完善开发
  
  1.为MM3D配置VC下的开发环境
  MM3D的开发环境是 Microsoft Visual C++6.0,它本身涉及很多方面,例如MFC,OpenGL,openAl,GDI等,因此必须为其进行开发环境配置。
  首先搭建完整的VC平台。其次,打开VC,选择菜单Tools|Options中的Directions标签页。按如下次序配置Include Files与Library Files的路径。然后,在VC中打开MM3D的源代码,在Object/Library Modules文本框中添加opengl32.lib glu32.lib glaux.lib。之后,选择菜单Build|Rebuild All进行全部编译。
  2.在MM3D中搭建新功能的框架
  在工程glOOP中添加实体对象类C3dObject类的两个子类:NURBS曲线类C3dWWNURBSCurve2与NURBS曲面类C3dWWNURBSSurface2。为了实现新建类的存储与读取,必须在C3dObject的IsShapeClass函数中添加如下代码:
  if(strcmp(lpszString, “C3dWWNURBS-Curve2 {”) == 0)
  {C3dWWNURBSCurve2*
  pObject = new C3dWWNURBSCurve2( );
  ASSERT(pObject);
  return pObject;}
  if(strcmp(lpszString, “C3dWWNURBS-Surface2 {”) == 0)
  {C3dWWNURBSSurface2*
  pObject = new C3dWWNURBSSurface2( );
  ASSERT(pObject);
  return pObject;}
  将两个类的声明放在glOOP.h头文件中。之后,在glOOP.h相应位置处添加对象的计数器并初始化为零:static unsigned int nNurbsCurveObjects2=0和 static unsigned int nNurbsSurfaceObjects2=0。
  在MM3D工程中添加MFC类库里CPropertyPage类的两个子类CWWNurbsCurve_2和CWWNurbsSurface2。为使这两个类与C3dWWNURBSCurve2和C3dWWNURBS-Surface2相联结,在其中各增加一个指针m_pObject分别指向C3dWWNURBSCurve2和C3dWWNURBSSurface2的对象。与此同时,做出对话框属性页分别与CWWNurbsCurve_2和CWWNurbsSurface2通过Class Wisard进行关联。
  
  三、 NURBS插值的编程实现
  
  1.B样条基函数的实现
  B样条基函数直接采用了递归定义的算法,即采用了函数递归调用\[4,5\]的方法实现。为使程序具有易阅读性与可维护性,将B样条基函数公式中的两个系数\[1-3\]用另外的函数单独表示。
  2.反算控制点
  控制点的反算是算法的关键所在。在曲线的反算过程中,将各步骤集中在了一个函数p2v()中,p2v表示由数据点反算控制点。首先,由数据点采用规范积累弦长参数化法算出节点矢量。其次,采用规范积累弦长参数化法依次生成在两种边界条件下的系数矩阵的三个对角向量和方程右侧的矢量。如下:
  void run_run(Adouble& md, //主对角线向量md
  Adouble& ld, //下对角线向量ld
  Adouble& ud, //上对角线向量ud
  Adouble& x, //控制顶点数组
  Adouble& f, //型值点数组
  int n) //方程个数(主对角线元素个数)
  首先由数据点求节点矢量。由于要解U、V两个方向的节点矢量,使用了同质不同名的两个类成员函数SetKnotU()和SetKnotV()。
  其次进行两次反算,分别用p2dFirst()和p2dSecond()两个函数实现,当执行完后者,曲面的全部控制顶点就算出来了。
  3.曲线、曲面的绘制
  分别用OpenGL中的gluNurbsCurve()和gluNurbsSurface()函数进行曲线和曲面绘制。在调用gluNurbsSurface()之前,仍需设定OpenGL的状态,还要设置函数的参数,所以对于曲线选择三维顶点的一维求值器类型GL_MAP1_VERTEX_3。对于曲面选择三维顶点的二维求值器类型GL_MAP2_VERTEX_3\[4,5\]。
  4.曲线、曲面数据的存储与读取
  在基于MFC的应用程序中,实现文档数据的存取是相当方便的。插值曲线采用存储数据点法,自由端不需存储额外数据,切矢条件则需要存储切矢数据\[4\]。为此,先对枚举成员变量m_enumType进行存取。然后判断m_enumType的值,若为自由端就不需进行额外存取操作,若为切矢条件就接着存取各切矢数据。
  熟悉应用MM3D软件几何建模模块,并
  深入研习了MM3D的源代码,发现MM3D几何建模系统的不完善,在MM3D平台上进行了NURBS插值曲线曲面功能的开发,实现了自由端和切矢两种边界条件,对曲线建模功能进行了完善,增添了对曲线进行修改的功能。通过实际运用,证明开发后的MM3D软件曲线曲面建模功能更强,开发模块的建模质量较理想。

标签:建模 几何 完善 插值