在VB环境中操作三维模型的实现方法

发表于:2007-05-25来源:作者:点击数: 标签:模型方法三维操作实现
目前在虚拟设计和数控仿真程序的设计中,多采用VC和三维造型核心来实现对三维模型的显示和动态操作。由于VC较难掌握,涉及到图形渲染和操作的部分更是如此,而且三维造型核心一般需要从国外购买,对于一般的 开发 应用来说因成本太高而缺乏可行性。而 VB 作
  目前在虚拟设计和数控仿真程序的设计中,多采用VC和三维造型核心来实现对三维模型的显示和动态操作。由于VC较难掌握,涉及到图形渲染和操作的部分更是如此,而且三维造型核心一般需要从国外购买,对于一般的开发应用来说因成本太高而缺乏可行性。而VB作为一种完全面向对象开发工具,在界面设计和数据库方面具有相当的优势,一般的设计人员也能够学习掌握,但是,在图形设计尤其是三维模型的显示和操作方面的研究和应用却不多。因此研究利用VB来实现三维模型的图形设计,将会在虚拟设计和仿真程序中发挥巨大的作用。

  三维模型的显示

  目前对三维图形程序的开发大多是基于OpenGL来实现的,OpenGL实际上是一个独立于窗口系统和操作系统的开放式三维图形标准,得到了众多计算机厂商的支持。作为一个优秀的三维图形接口,OpenGL提供了丰富的绘图命令,利用这些命令能够开发出高性能、交互式的三维图形应用程序。它与VC有着紧密的开发接口,但由于VC对于一般非计算机专业的工程技术人员来说难以掌握,因而给工程领域的仿真程序设计带来了很大的不便。但目前支持VB等开发工具的OpenGL开发库也开始出现。本文就是基于VBOpenGL(vbogl.tlb)库来实现的,这是一个可免费使用的第三方库,它封装了大量的底层OpenGL库函数,很大程度上简化了开发工作。

  在VB中建立三维图形环境之前,首先要在“工程”菜单下通过“引用”子菜单下加入VBOpenGL库,然后在窗体上加入一个PictureBox控件作为三维模型的显示和操作区域。

  作为工程应用的虚拟设计或仿真程序,其三维模型可通过一般的三维造型软件如Solidworks来设计,然后通过软件提供的图形接口输出为中性文件。目前主流的三维造型软件都支持多种标准文件格式,其中STL 文件是一种可读性较强的文件格式,适合在工程仿真程序中使用。STL 文件格式最早是作为快速成型领域中的接口标准,已被广泛应用于各种三维软件中,很多主流的商用三维软件都支持STL 文件的输入输出。STL模型是以三角形集合来表示物体外轮廓形状的几何模型,其中每个三角形面片有四个数据项表示,即三角形的三个顶点坐标和三角形面片的外法线矢量,STL 文件即为多个三角形面片的集合。

  因此在VB环境中可通过读入STL 文件并在绘图空间中重现的方法来显示三维模型。首先对读入的STL 文件按行分解,从中解析出每个面元,并存储到结构体数组中,接下来的工作就是通过VBOpenGL中的glColor3d函数对每个面元进行渲染和着色,并把渲染的结果以图形的形式填充到PictureBox控件的绘图区中,最终实现整个模型的显示。需要说明的是在显示三维模型之前,必须对VBOpenGL中的初始环境进行定义。

  三维模型的操作方法

  (1)放大和缩小操作 对三维模型的操作一般包括放大、缩小、旋转和平移等操作,其中放大、缩小操作可通过同一个鼠标事件来驱动,例如当光标向上移动时使模型缩小,而光标向下移动时则使模型放大。这可以通过调整Opengl环境中的景深来实现。其中SVposY是光标移动过程中的上一个位置的纵坐标,而Y为当前光标的纵坐标,Zoom为模型的景深,step_zoom为光标移动一个基本单位时景深的变化值,它可通过程序的实际需要来设定。以下是放大缩小操作的程序代码。

clearcase/" target="_blank" >cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1">
If Y < SposY Then
 Zoom = Zoom - step_zoom ‘缩小
Else
 Zoom = Zoom + step_zoom ‘放大
End If
If Zoom < 0 Then Zoom = 0.0001

  (2)旋转操作 旋转操作是通过对模型场景视角的法向量按照一定的步幅来调整实现的。下面的代码是鼠标事件中模型旋转操作的调整过程,当光标左右移动时,模型向左或向右反转,而当光标上下移动时,模型向上或向下反转,其旋转的速度可通过改变步幅来实现。这里取步幅为0.005,它是以弧度为单位的一个角度值,首先要通过光标的当前位置和上次位置差的绝对值来判断光标的移动方向,然后根据判断出的光标方向给视角法向量的分量ym和xm增加或者减去一个步幅,从而实现模型在三维空间中的旋转操作,其中法向量的分量zm保持初始值不变。

diffx = Abs(SposX - X)
diffy = Abs(SposY - Y)
If diffx > diffy Then
 If X > SposX Then
  ym = ym - X * 0.005 ‘向右旋转
 Else
  ym = ym + X * 0.005 ‘向左旋转
 End If
Else
 If Y > SposY Then
  xm = xm - Y * 0.005 ‘向下旋转
 Else
  xm = xm + Y * 0.005 ‘向上旋转
 End If
End If
End If

  (3)平移操作 平移操作的原理和旋转操作类似,它是通过对模型场景的各个位置分量的调整来实现的。和旋转操作一样,首相是通过光标的当前位置和上次位置差的绝对值来判断光标的移动方向,然后根据判断结果对相应的位置分量PosX和PosY增加或减去一个指定的步幅。下面是平移操作的VB代码。

If diffx > diffy Then
 If X > SposX Then
  PosY = PosY + 0.005 ‘上移
 Else
  PosY = PosY - 0.005 ‘下移
 End If
Else

 If Y > SposY Then
  PosX = PosX - 0.005 ‘左移
 Else
  PosX = PosX + 0.005 ‘右移
 End If
End If
End If

  按照以上的方法,我们实现了一个如图1所示的工业机器人仿真程序,可通过STL文件导入机器人的三维模型,并按照规定的动作进行三维空间内的运动仿真。


图1 机器人仿真工具

  结束语

  用VB来设计三维模型的操作程序相对来说要简单、直观,而且容易掌握。通过第三方库函数VBOpenGL,可省去大量的底层编程工作,在一般工程应用的程序设计中能起到事半功倍的效果。

原文转自:http://www.ltesting.net