首页 基于VB和Direct3D的STL文件可视化研究2016.4.23

基于VB和Direct3D的STL文件可视化研究2016.4.23

举报
开通vip

基于VB和Direct3D的STL文件可视化研究2016.4.23基于VB和Direct3D的STL文件可视化研究2016.4.23 基于VB和DirectX3D技术的对STL格式的三维图形文件的 可视化研究 广州番禺职业技术学院机器人研究班 廖永、罗旭能、黄智成、梁炳华、杨锐豪 谢原祥、陈永波、胡俊彬、陈梓峰、陈荣东 pzzz2016@163.com 摘要:Direct3D是一个三维模型库,在三维真实感图形制作中具有优秀的性能,广泛运用于CAD、大型游戏和仿真模拟软件开发;STL是三维模型常用的文件格式,其使用三角面片来表示三维实体模型。对STL文件的可视化研究是对...

基于VB和Direct3D的STL文件可视化研究2016.4.23
基于VB和Direct3D的STL文件可视化研究2016.4.23 基于VB和DirectX3D技术的对STL格式的三维图形文件的 可视化研究 广州番禺职业技术学院机器人研究班 廖永、罗旭能、黄智成、梁炳华、杨锐豪 谢原祥、陈永波、胡俊彬、陈梓峰、陈荣东 pzzz2016@163.com 摘要:Direct3D是一个三维模型库,在三维真实感图形制作中具有优秀的性能,广泛运用于CAD、大型游戏和仿真模拟软件开发;STL是三维模型常用的文件格式,其使用三角面片来表示三维实体模型。对STL文件的可视化研究是对模型进行后续处理和软件二次开发的前提,本文在对STL文件进行分析的基础上,运用Direct3D强大的函数功能在Visual Basic6.0平台上进行文件的可视化研究,并对读入的STL文件进行三维真实感渲染、视角变换、显示缩放等,使STL文件数据模型的显示功能更加完善,采取简洁易懂的数据存储结构进行渲染。最后利用该方法开发出一个基于STL文件的数据模型的可视化软件,该软件为STL文件的 ,并进行了大量的STL文件导入后续处理及其相应的二次开发提供了有力的支持 显示测试实验,达到了预期的目标。 关键词:Direct3D; STL文件;可视化 1(引言 目前,CAD 系统在三维建模上具有优秀强大的功能,但在功能梯度材料零件建模、3D 模型数据处理等专业领域为了达到特定的目标,往往需要对 CAD 软件进行二次开发。而在二次开发前期准备阶段,读取 CAD 模型的几何信息和拓扑信息势在必行,这样,对 CAD 模型数据文件的可视化研究必不可少,本文在探讨 STL 文件的基础上,选用简便的数据结构在Direct3D基础上对 STL 文件进行了可视化研究。 2(STL 文件格式 STL文件是在计算机图形应用系统中,用于表示三角形网格的一种文件格式。 它的文件格式非常简单, 应用很广泛。 STL 文件是若干空间小三角形面片的集合,通过三维模型表面的三角网格化获得,每个三角形面片用三角形的三个顶点和指向模型外部的三角形面片的法向量组成。 STL 文件有两种数据格式,一种是 ASC?格式,另一种是二进制格式。二进制的文件格式要小得多,大约是 ASC?格式的 1/6,但 ASC? 格式的文件可读性较强,便于测试。由于 STL 的 ASC?格式文件的可读性,本文选用这种格式作为可视化研究。 STL ASC?格式 Solid filenamestl//文件路径及文件名 facet normal xyz//三角面片法向量的3个分量值 outer loop vertex xyz//三角面片第一个顶点坐标 vertex xyz//三角面片第二个顶点坐标 vertex xyz//三角面片第三个顶点坐标 end loop end facet//完成一个三角面片定义 ......// 其他facet Endsolid filenamestl//整个STL文件定义结束 在三角形面片格式里,三个顶点(vertex)跟该三角面片的法向量符合右手螺旋定则,如 图 1 所示。 图 1 单个三角面片 STL 文件在机械工业领域中有广泛的应用,主要因为有以下的有点: 2.1、STL 文件生成的简单性。几乎所以 CAD 软件均具有输出 STL 文件的功能,同时还可以控制输出的 STL 模型的精度。 2.2、输入文件广泛。大多数三维几何模型都可以通过表面的三角化生成 STL 文件。 2.3、具有简单的分层算法。由于 STL 文件数据简单,所以分层算法相对要简单的多。 2.4、模型易于分割。当成型的零件很大而很难在成型机上一次成型时,这时应该将模型 分割为多个小的部分,分别制造,模型分割对于 STL 文件来说相对简单的多。 3. Visual Basic概述 Visual Basic是一种由 Microsoft 公司开发的结构化的、模块化的、面向对象的、包含协助开发环境的事件驱动为机制的可视化程序设计语言。这是一种可用于微软自家产品开发的语言。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建Active X控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。 4.Direct3D概述 Direct3D(简称:D3D)是微软公司在Microsoft Windows操作系统上所开发的一套3D绘图编程接口,是DirectX的一部分,目前广为各家显示卡所支援。与OpenGL同为电脑绘图软体和电脑游戏最常使用的两套绘图编程接口之一。Direct3D是一种底层图形API (Application Programming Interface,应用程序接口),能让我们利用3D硬件加速来渲染加速3D事件,可看作应用程序和图形设备间的中介。 Direct3D坐标系统 Direct3D图形应用程序使用两种类型的笛卡尔坐标系统:即左手坐标系统(left-handed)和右手坐标系统(right-handed)。在这两种坐标系统中,x-轴正方向均指向右边,y-轴正方向也都指向上方。z-轴的方向可以用左、右手定则来确定,即握起左(或右)手的四指来代表由x-方向旋转到y-方向,则左(或右)手的拇指就指向z-轴的正方向。如下图: 对三维坐标系统中定义的对象,基本的操作包括:平移(translate),旋转(rotate)和缩放(scale)。也可以将这些基本变换组合起来建立一个变化矩阵。 Direct3D图元 一个Direct3D图元就是一些顶点的集合,它们组成了一个三维实体。Direct3D中最重要的不是点、不是线,也不是平面,而是三角形。Direct3D用三角形来组成多边形和三维物体。 矩阵与变换 Direct3D中使用矩阵(matrices)来定义世界(world), 视(view)和投影变换(projection transformation)。 矩阵由 D3DMATRIX 结构来定义,是一个 4×4 的二维数组。常用的变换包括:平移(translation),旋转(rotation)和缩放(scaling)。使用矩阵的一个最大好处就是可以通过矩阵相乘将几个矩阵变换的效果合并起来。 5 5(Direct3D中STL文件的导出和显示 5.1、用3D制图软件(如Solidworks, UG等)打开绘制好的三维零件图, 如下图的长方体(我这里就不在绘制了,大家也可以随便找一个3D零件来演示) 1. 2 5.2、为3D零件制作STL格式,需要从:文件,导出,STL开始 1. 3 5.3、点开导出STL图纸后,其显示的操作界面如下: 1. 4 5.4、为要导出的STL文件指定文件名; 5.5、选中需要执行导出的零件,可以选一个,也可以像上图一样,全部选中,点击确定; 5.6、然后打开我们刚才保存文件的位置就可以找出txt文件了,(对于ASCII格式的STL文件,其文件后缀名为txt,即文本格式)。 6(STL 文件读取与显示 6.1要在VB程序中显示三维图形,要先调用3D显示的支持环境,通过引用Directx3D的动态链接库实现。 6.1.1在菜单栏上点击“工程” 6.1.2选中“引用” 6.1.3点击“浏览” 6.1.4添加“DirectX 8 for Visual Basic Type Library”类型库 6.2然后就是在From窗口界面添加控件了。控件一共有四个,分别为两个CommandButton,一个Timmer,一个CommonDialog。 6.2.1,用CommonDialog控件调用打开文件对话框来添加和打开目标文件。 创建CommonDialog控件的步骤为: 点击菜单栏的“工程”——选择“部件”——在控件栏当中勾选“Microsoft Common Dialog Control 6.0(SP6)” 6.2.2.两个CommondButton控件的作用分别为,导入文件和显示已导入的STL文件。 6.2.3. Timer控件用来实现已导入显示的3D模型按照一定的时间间隔持续的旋转。 7. VB程序中的文件读取和3D显示的结构逻辑 7.1 定义变量和数组结构。 7.2 打开txt格式的STL文件。 7.3 提取STL文件里的每个三角形的顶点信息,放入到预定义的数组里。 7.4调取DirectX 动态链接库, 创建3D环境。 7.5 用timer计时器每隔一定周期后顺序调取以下子程序实现物体的动态显示。 7.6 设置三维矩阵转换和视角变换。 7.7 设置图形渲染,同时调用7.5子程序。 7.8 将三角形顶点信息放入到DirectX3D的顶点缓存。 7.9 显示图形。 本文在对 STL 文件特点进行分析的基础上,利用 Visual Basic 6.0和 DirectX3D 编程技术对 STL 文件进行了可视化验证,开发了 PZZZ-CADview 件的实际效果,对从 UG 中导出的 STL 软件,为了验证该软件显示 STL 文 文件进行了测试,如下图所示,取得了良好的可视化效果。 STL文件的可视化研究是对三维模型后续操作和软件二次开发的前提和基础。本文通过对STL文件数据格式的研究,以Visual Basic 6.0作为开发平台,利用Basic语言中的文件操作方法和DirectX3D函数库对STL文件可视化进行了研究和实现,现在也为进一步对STL文件进行数据处理及其相关领域的研究做了必要的前期准备。鉴于STL文件的实用性和Direct函数库的强大功能,本文具有一定的使用价值和应用前景。 8. 下面为程序的完整代码: Option Explicit Dim MyDirectX8 As New DirectX8, MyDirect3D8 As Direct3D8 '定义3D接口名称 Dim MyDirect3DDevice8 As Direct3DDevice8 '定义3D设备接口 Dim VBuffer1 As Direct3DVertexBuffer8 '定义3D缓存变量 Dim ctFlag As Long '定义3D显示格式变量 Private Type VertexRHW '定义顶点格式 XYZ As D3DVECTOR '定义变量XYZ为D3DVECTOR类型。 Color As Long '定义变量Color 为长整数型。 End Type Dim VertRHW() As VertexRHW '定义数组VertRHW()为已预定义的顶点格式。 Dim Wjm As String ' 定义变量Wjm(文件名)为字符串类型。 Dim DDi As Long '定义变量DDi(三角形顶点序号) 为长整数型。 Private Type DinDian ' 定义一个类型 (名为顶点) x As Single '定义X为单精度浮点类型 y As Single '定义Y为单精度浮点类型 z As Single '定义Z为单精度浮点类型 End Type Dim DD() As DinDian '定义名为DD()的数组类型为DinDian Dim Xzjd As Single '定义变量Xzjd(旋转角度)为单精度小数 Private Sub Command1_Click() '按下Command1控件,名字为读取STL文件 Call HqSTL ' 调取子程序,获取STL 文本文件的数据放入数组。 Call Ini3D '调取子程序,初始化DIRECT3d 环境 End Sub Private Sub Command2_Click() '按下Command2控件 名字为三维立体显示 Xzjd = 0 '初始化旋转角度为0 Timer1.Enabled = True '启动计时器Timer1. Timer1.Interval = 1000 '计时器1秒调取一次视角转换和图形绘制子程序 End Sub Private Sub Timer1_Timer() Call Transform '调取三维转换和视角变换子程序. Call Render ' 调取图形渲染子程序. End Sub Private Sub HqSTL() '获取STL 文本文件的数据放入数组。 Dim i As Integer '定义i为整形变量 Dim Wjcd As Long ' 定义变量(文件长度:Wjcd)为长整型 Dim Wjm As String ' 定义变量(文件名:Wjm)字符串类型 Dim Txtbuf() As String ' 定义名为Txtbuf的数组为字符串类型, 用以临时存放读出的文本数据 Dim Txtspl() As String '定义名为Txtspl的数组为字符串类型,临时存放分割开后的文本数据 CommonDialog1.Filter = "All Files(*.*)|*.*|STL_Files(*.stl)|*.stl|Txt_Files(*.txt)|*.txt" '设置文件过滤类型 CommonDialog1.FilterIndex = 2 '设置过滤索引为第三个,即TXT格式文件首先显示出来,如前文描述, ASCII的STL文件实际导出后为TXT格式 CommonDialog1.ShowOpen '显示打开文件对话框 If CommonDialog1.CancelError = True Then '如果点击对话框取消,则退出程序 Exit Sub End If Wjm = CommonDialog1.FileName '获取文件路径,并储存在wjm变量内 ReDim Txtbuf(FileLen(Wjm) / 4) '先用文件的长度除以4,大概得到文本缓存数组所需长度 Open Wjm For Input As #1 '以顺序方式打开文件,读取模式 i = 0 '给序号i赋值为0 ReDim DD(FileLen(Wjm) / 4) '文件的长度除以4,大概得到顶点数组所要的长度。 DDi = 1 '定义第一个顶点序号为1 Do Until EOF(1) '一直读取到文件尾 Line Input #1, Txtbuf(i) '逐行获取文本,并赋予到Txtbuf数组内 If InStr(1, Txtbuf(i), "vertex") > 0 Then '在每行中判断有无"vertex" Txtspl = Split(Txtbuf(i), " ") '如有,用空格将当前文本行分隔为几个部分。 DD(DDi).x = Txtspl(7) '第7位为顶点的X数据, 不同的3D软件输出的TXT格式会有不同,这是UG 生成的 DD(DDi).y = Txtspl(8) '第8位为顶点的Y数据 DD(DDi).z = Txtspl(9) '第9位为顶点的Z数据 DDi = DDi + 1 ' 读完当前行后,将顶点序号加1, End If i = i + 1 '改变缓存文本序号 Loop '继续读下一行 Close #1 '关闭已打开的文件 DDi = DDi - 1 ' 减1后,DDi即为三角形的个数 End Sub Private Sub Ini3D() '初始化DirectX 3D 环境 Dim DispMode As D3DDISPLAYMODE, D3dpp As D3DPRESENT_PARAMETERS '定义显示模式和参数变量 Set VBuffer1 = Nothing '初始化缓存变量为空 Call DirectFree '释放DirectX3D Set MyDirect3D8 = MyDirectX8.Direct3DCreate() '定义创建的3D设备 MyDirect3D8.GetAdapterDisplayMode D3DADAPTER_DEFAULT, DispMode '获取显示信息 With D3dpp '定义D3dpp参数 .Windowed = 1 '1为 窗口显示 0是全屏显示 .SwapEffect = D3DSWAPEFFECT_COPY_VSYNC '扫描方法 .BackBufferFormat = DispMode.Format '后台缓存像素格式 .BackBufferWidth = DispMode.Width '后台缓存中表面宽度 .BackBufferHeight = DispMode.Height '后台缓存中表面高度 End With Set MyDirect3DDevice8 = MyDirect3D8.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Me.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, D3dpp) '创建3D设备 MyDirect3DDevice8.SetRenderState D3DRS_FILLMODE, 3 '设置填充模式,1为点填充,2为线框,3为实体 MyDirect3DDevice8.SetRenderState D3DRS_CULLMODE, 1 '设置背面剪裁模式 1为不剪裁 2为剪裁背面。 MyDirect3DDevice8.SetRenderState D3DRS_LIGHTING, 0 '设置灯光效果,加进颜色后改变 End Sub Private Sub DirectFree() '释放设备 Set MyDirect3DDevice8 = Nothing '释放3D设备接口 Set MyDirect3D8 = Nothing '释放3D接口名称 Set MyDirectX8 = Nothing '释放3D环境 End Sub Private Sub Render() '渲染: 1.清屏 2.开始绘制 3.正式绘制 4.结束绘制 5.显示 Dim BackClor As Long '定义背景颜色变量 BackClor = D3DColorRGBA(114, 117, 114, 1) '定义背景颜色(R,G,B,透明度) With MyDirect3DDevice8 .Clear 0&, ByVal 0, D3DCLEAR_TARGET, BackClor, 1, 0& '用背景颜色清屏 .BeginScene '开始绘制 Call DrawTriangle '调取绘制3D 图形的子程序 .EndScene '结束绘制 .Present ByVal 0, ByVal 0, 0, ByVal 0 '显示 End With End Sub Private Sub DrawTriangle() '画图 Dim mount As Long '定义mount变量为长整数型 Dim nSize As Long '定义nSize 变量为长整数型 ReDim VertRHW(1 To DDi) ' 再次定义VertRHW 长度为已提取STL文件内三角形的个数。 For mount = 1 To DDi '逐个读取所有三角形的顶点数据到结构数组 VertRHW(mount).XYZ = vec3(DD(mount).x / 100, DD(mount).y / 100, DD(mount).z / 100) ' 调用vec3函数将顶点的X,Y,Z数据放入到VertRHW数组 VertRHW(mount).Color = D3DColorRGBA(255, 216, 22, 10) '将黄色的数据放入到数组 Next '下一个 nSize = Len(VertRHW(1)) '获取单个顶点数组的大小 ctFlag = D3DFVF_XYZ + D3DFVF_DIFFUSE '坐标+颜色(三维环境下点的显示格式) Set VBuffer1 = MyDirect3DDevice8.CreateVertexBuffer(DDi * nSize, 0, ctFlag, D3DPOOL_DEFAULT) '设置缓存内容(定点缓存大小,附加属性,顶点格式,缓存存在显卡中) D3DVertexBuffer8SetData VBuffer1, 0, DDi * nSize, 0, VertRHW(1) '用VertRHW数组的信息填满VBuffer1缓存 With MyDirect3DDevice8 .SetStreamSource 0, VBuffer1, nSize '设置渲染流 .SetVertexShader ctFlag '设置渲染格式 .DrawPrimitive D3DPT_TRIANGLELIST, 0, DDi '画的格式为三角形,DDi是三角形的个数 End With End Sub Private Function vec3(x As Single, y As Single, z As Single) As D3DVECTOR '定义缓存定点格式,定义数组函数 vec3.x = x '把x赋值给vec3.x vec3.y = y '把x赋值给vec3.y vec3.z = z '把z赋值给vec3.z End Function Private Sub Transform() '视角变换子程序 Dim mTrans As D3DMATRIX, Rx As D3DMATRIX, Ry As D3DMATRIX, Rz As D3DMATRIX Dim MatX As D3DMATRIX, MatY As D3DMATRIX, MatZ As D3DMATRIX Dim MatView As D3DMATRIX Dim MatWorld As D3DMATRIX '定义变量为矩阵类型 D3DXMatrixIdentity MatWorld '初始化单位矩阵 If Xzjd > 3.14 * 2 Then '判断旋转角度是否大于360度 Xzjd = 0 '如是,将旋转角度置为0度 Else Xzjd = Xzjd + 3.14 / 180 * 30 '计时器每次触发,将变量Xzjd加30度 End If D3DXMatrixRotationX MatX, Xzjd ' Xzjd 为弧度,将每次计时器被触发后产生的弧度输出给MatX矩阵,绕X轴旋转 D3DXMatrixRotationY MatY, Xzjd '绕y轴旋转,得到的矩阵赋值给Maty D3DXMatrixMultiply MatWorld, MatWorld, MatX '第二个与第三个X矩阵合并然后赋值给第一个矩阵 D3DXMatrixMultiply MatWorld, MatWorld, MatY '第二个与第三个Y矩阵合并然后 赋值给第一个矩阵 MyDirect3DDevice8.SetTransform D3DTS_WORLD, MatWorld '进行世界矩阵变换 D3DXMatrixLookAtLH MatView, vec3(0, 3, -5), vec3(0, 0, 0), vec3(0, 1, 0) '输出矩阵观察坐标,目标坐标,向上坐标 MyDirect3DDevice8.SetTransform D3DTS_VIEW, MatView '设置视角变换 Dim MatProj As D3DMATRIX '定义投影变量为 D3DMATRIX的对象 D3DXMatrixPerspectiveFovLH MatProj, 1.2, 1, 1, 100 ' MatProj是输出矩阵,1.2是视角范围(单位是弧度),纵横比,近裁剪,远裁剪 MyDirect3DDevice8.SetTransform D3DTS_PROJECTION, MatProj '进行投影变换 End Sub
本文档为【基于VB和Direct3D的STL文件可视化研究2016.4.23】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_153723
暂无简介~
格式:doc
大小:191KB
软件:Word
页数:18
分类:企业经营
上传时间:2017-10-20
浏览量:46