OpenGL VBWord文档格式.docx
《OpenGL VBWord文档格式.docx》由会员分享,可在线阅读,更多相关《OpenGL VBWord文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
![OpenGL VBWord文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/24/8e47a4ab-a61b-4a01-86c7-ebc3e4f0bc81/8e47a4ab-a61b-4a01-86c7-ebc3e4f0bc811.gif)
:
1不知道怎么导入
2导入后怎么进行编辑
3OPENGL怎么进行运动仿真
如何制作三维空间vb
20-解决时间:
2007-12-209:
53
我不想研究那麻烦的三维转二维的公式,vb中有没有什么方法,有没有一个对象,可以直接画三维图形(即知道一个在三维上的点,在屏幕上显示出来)
用dx如果行的话,请具体给出,谢谢。
最后做菜单等
用VB画圆、正方形、长方形、球、正方体、长方体
50-解决时间:
2008-3-322:
20
要编程的内容过程
问题补充:
最好编程简单点否则以我的程度怕看不懂
画圆
VERSION5.00
BeginVB.FormFMain
BorderStyle=1'
FixedSingle
Caption="
Form1"
ClientHeight=5205
ClientLeft=45
ClientTop=330
ClientWidth=7035
LinkTopic="
MaxButton=0'
False
MinButton=0'
ScaleHeight=5205
ScaleWidth=7035
StartUpPosition=2'
屏幕中心
BeginVB.CheckBoxchkA
自动反转"
Height=375
Left=5280
TabIndex=5
Top=3600
Width=1695
End
BeginVB.CheckBoxchkAuto
自动旋转"
Height=255
TabIndex=4
Top=3240
Width=1575
BeginVB.TimertmrTurn
Enabled=0'
Interval=100
Top=4080
BeginVB.PictureBoxpicDraw
Height=5000
Left=120
ScaleHeight=4935
ScaleWidth=4935
TabIndex=3
Top=120
Width=5000
BeginVB.CommandButtoncmdTurnAnti
正向"
Height=495
TabIndex=2
Top=1200
BeginVB.TextBoxtxtAngle
TabIndex=1
Text="
30"
BeginVB.CommandButtoncmdTurn
反向"
TabIndex=0
Top=600
AttributeVB_Name="
FMain"
AttributeVB_GlobalNameSpace=False
AttributeVB_Creatable=False
AttributeVB_PredeclaredId=True
AttributeVB_Exposed=False
OptionExplicit
PrivateConstrPIAsSingle=3.14159265358979
PrivateiAngleAsInteger'
转过角度
PrivateSubchkAuto_Click()
tmrTurn.Enabled=chkAuto.Value
EndSub
PrivateSubcmdTurn_Click()
iAngle=iAngle+Val(txtAngle.Text)
CallDraw
PrivateSubcmdTurnAnti_Click()
iAngle=iAngle-Val(txtAngle.Text)
PrivateSubForm_Load()
picDraw.Scale(-1,1)-(1,-1)'
中心设为原点
picDraw.DrawWidth=5'
加粗
PrivateSubDraw()
picDraw.Cls
picDraw.Line(0,0)-(Cos(iAngle/180*rPI),Sin(iAngle/180*rPI))
PrivateSubtmrTurn_Timer()
IfchkA.Value=0Then
CallcmdTurnAnti_Click
Else
CallcmdTurn_Click
EndIf
矩形
PublicSubDrawRectangle(ByValWidthAsLong,ByValHeightAsLong,OptionalTopAsLong,OptionalLeftAsLong)
Line(Left,Top)-(Left+Width,Top)
Line(Left,Top)-(Left,Top+Height)
Line(Left,Top+Height)-(Left+Width,Top+Height)
Line(Left+Width,Top)-(Left+Width,Top+Height)
球
定义一个数组记录某一个值是不是已经被使用
比如有10个数供选择,那就定义a[10],赋初值0,表示没有使用,当抽取一个号码后,比如是5,那就令a[5-1]=1,求救已经使用,每次取数时判断一下取得的数i对应的a[i]是否等于0就可以了.
长方体
PrivateTypexyz'
定义3D坐标类型
yAsSingle
zAsSingle
EndType
Privatexyz1()Asxyz
Publicx0AsSingle,y0AsSingle,x1AsSingle,y1AsSingle
PrivateSubCheck1_Click()
Ifx1=0Ory1=0Then
ExitSub
IfCheck1.Value=1Then'
如果选择显示空间坐标轴,就画出空间坐标轴
Line(x1,y1)-(x1,y1-6400)
Line(x1,y1)-(x1+6400,y1)
Line(x1,y1)-(x1-4050,y1+4050)
Line(x1,y1-6400)-(x1-200,y1-6200)
Line(x1,y1-6400)-(x1+200,y1-6200)
Line(x1+6400,y1)-(x1+6200,y1+200)
Line(x1+6400,y1)-(x1+6200,y1-200)
Line(x1-4050,y1+4050)-(x1-4050,y1+3850)
Line(x1-4050,y1+4050)-(x1-3850,y1+4050)
Cls
PrivateSubCommand1_Click()
drawpntVal(Text1.Text),Val(Text2.Text),Val(Text3.Text)'
这是在三维空间画点的事件
PrivateSubCommand2_Click()
CallVScroll1_Change(0)'
画长方体
PrivateSubCommand3_Click()
dmove0,500,0'
移动
PrivateSubCommand4_Click()
dmove-500,0,0'
PrivateSubCommand5_Click()
dmove500,0,0'
PrivateSubCommand6_Click()
dmove0,-500,0'
PrivateSubForm_MouseUp(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)
x0=x
y0=y
x1=x
y1=y
CallCheck1_Click
ReDimxyz1(0To1)
xyz1(0).y=x
xyz1(0).z=y
PSet(x,y)
'
在程序上点击鼠标画出空间坐标轴,并记录原点
Subdrawpnt(dxAsSingle,dyAsSingle,dzAsSingle)
DimdxyAsSingle
dxy=Fix(dx*Sqr
(2)/2)
xyz1(0).y=x0-dxy+dy
xyz1(0).z=y0+dxy-dz
PSet(xyz1(0).y,xyz1(0).z)
画点的过程
Subdline(dx1AsSingle,dy1AsSingle,dz1AsSingle,dx2AsSingle,dy2AsSingle,dz2AsSingle)
Dimdxy1AsSingle,dxy2AsSingle
dxy1=Fix(dx1*Sqr
(2)/2)
dxy2=Fix(dx2*Sqr
(2)/2)
xyz1(0).y=x0-dxy1+dy1
xyz1(0).z=y0+dxy1-dz1
xyz1
(1).y=x0-dxy2+dy2
xyz1
(1).z=y0+dxy2-dz2
Line(xyz1(0).y,xyz1(0).z)-(xyz1
(1).y,xyz1
(1).z)
划线的过程
PrivateSubVScroll1_Change(indexAsInteger)
Ifx0=0Ory0=0Then
DimaAsSingle,bAsSingle,cAsSingle
a=VScroll1(0).Value*900
b=VScroll1
(1).Value*900
c=VScroll1
(2).Value*900
squarea,b,c
根据a,b,c(长,宽,高)来画长方体的过程
Subsquare(aAsSingle,bAsSingle,cAsSingle)
dline0,0,0,a,0,0
dline0,0,0,0,b,0
dline0,0,0,0,0,c
dlinea,0,0,a,b,0
dlinea,0,0,a,0,c
dline0,b,0,a,b,0
dline0,b,0,0,b,c
dline0,0,c,a,0,c
dline0,0,c,0,b,c
dlinea,b,c,a,b,0
dlinea,b,c,a,0,c
dlinea,b,c,0,b,c
Subdmove(dxAsSingle,dyAsSingle,dzAsSingle)
x0=x0+dx
y0=y0-dy
CallVScroll1_Change(0)
移动长方体的过程
正方体和长方体的原理一样,写不动啦!
!
在VB环境中操作三维模型的实现方法
目前在虚拟设计和数控仿真程序的设计中,多采用VC和三维造型核心来实现对三维模型的显示和动态操作。
由于VC较难掌握,涉及到图形渲染和操作的部分更是如此,而且三维造型核心一般需要从国外购买,对于一般的开发应用来说因成本太高而缺乏可行性。
而VB作为一种完全面向对象的开发工具,在界面设计和数据库方面具有相当的优势,一般的设计人员也能够学习掌握,但是,在图形设计尤其是三维模型的显示和操作方面的研究和应用却不多。
因此研究利用VB来实现三维模型的图形设计,将会在虚拟设计和仿真程序中发挥巨大的作用。
目前对三维图形程序的开发大多是基于OpenGL来实现的,OpenGL实际上是一个独立于窗口系统和操作系统的开放式三维图形标准,得到了众多计算机厂商的支持。
作为工程应用的虚拟设计或仿真程序,其三维模型可通过一般的三维造型软件如Solidworks来设计,然后通过软件提供的图形接口输出为中性文件。
目前主流的三维造型软件都支持多种标准文件格式,其中STL
文件是一种可读性较强的文件格式,适合在工程仿真程序中使用。
STL
文件格式最早是作为快速成型领域中的接口标准,已被广泛应用于各种三维软件中,很多主流的商用三维软件都支持STL
文件的输入输出。
STL模型是以三角形集合来表示物体外轮廓形状的几何模型,其中每个三角形面片有四个数据项表示,即三角形的三个顶点坐标和三角形面片的外法线矢量,STL
文件即为多个三角形面片的集合。
因此在VB环境中可通过读入STL
文件并在绘图空间中重现的方法来显示三维模型。
首先对读入的STL
文件按行分解,从中解析出每个面元,并存储到结构体数组中,接下来的工作就是通过VBOpenGL中的glColor3d函数对每个面元进行渲染和着色,并把渲染的结果以图形的形式填充到PictureBox控件的绘图区中,最终实现整个模型的显示。
三维模型的操作方法
(1)放大和缩小操作
对三维模型的操作一般包括放大、缩小、旋转和平移等操作,其中放大、缩小操作可通过同一个鼠标事件来驱动,例如当光标向上移动时使模型缩小,而光标向下移动时则使模型放大。
这可以通过调整Opengl环境中的景深来实现。
其中SVposY是光标移动过程中的上一个位置的纵坐标,而Y为当前光标的纵坐标,Zoom为模型的景深,step_zoom为光标移动一个基本单位时景深的变化值,它可通过程序的实际需要来设定。
以下是放大缩小操作的程序代码。
If
Y
<
SposY
Then
Zoom
=
-
step_zoom
‘缩小
+
‘放大
End
0
Then
0.0001
(2)旋转操作
旋转操作是通过对模型场景视角的法向量按照一定的步幅来调整实现的。
下面的代码是鼠标事件中模型旋转操作的调整过程,当光标左右移动时,模型向左或向右反转,而当光标上下移动时,模型向上或向下反转,其旋转的速度可通过改变步幅来实现。
这里取步幅为0.005,它是以弧度为单位的一个角度值,首先要通过光标的当前位置和上次位置差的绝对值来判断光标的移动方向,然后根据判断出的光标方向给视角法向量的分量ym和xm增加或者减去一个步幅,从而实现模型在三维空间中的旋转操作,其中法向量的分量zm保持初始值不变。
diffx
Abs(SposX
X)
diffy
Abs(SposY
Y)
>
T