vb.net开发三维 vb三维绘图
VB.net可以开发小型3D图形显示软件吗?
可以借助DirectX来编程。免费3D引擎可不好找,一般来说速度比不上硬件加速后的DX,尤其令人头疼的是一般都没有针对VB的文档,LZ有这方面理想的话,自己写一个吧……
成都创新互联公司于2013年创立,是专业互联网技术服务公司,拥有项目网站设计制作、成都网站设计网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元富宁做网站,已为上家服务,为富宁各地企业和个人服务,联系电话:13518219792
我不得不承认在VB上写DirectX的教程相当难找!如果LZ想深入研究三维图形问题,C++一定要学,就算不能用C++编程,起码要能把C++程序翻译成VB程序。
我自己学会DX编程花了两三个月(很浅)。编这样一个程序难度是有点大的。
工具:DirectX9和其针对VB的库(项目-添加引用。.NET库里DX库一般都有),VB不知道现在支不支持DX10以上的版本,不过9绝对够用了。
思路:一切3D图形都是由三角形拼成的。矩形挖掉一个圆孔可不是一个方便画的图形,我估计至少得有24个三角形。你需要记录这些点的坐标,或者干脆把它们写在文件里,到时读出来。
这是我的一个老DX程序的不完全的代码(显示一个黑乎乎的平面),不一定能编译,可以参考一下。
Imports Microsoft.DirectX '一定要~
Public Class FormMain
'Direct3D Startup
Dim d3dpp As New Direct3D.PresentParameters 'DX基本参数,例如全屏还是窗口等
Public MyDevice As Direct3D.Device ‘DX基本设备,画图就靠它。
'Matrices
Dim matWorld, matView, matProj As Matrix '世界位置矩阵,摄像机位置矩阵和透视矩阵,数学要学好啊。
'mesh
Public MyPlane as Direct3D.Mesh ’我们的物体
Public VBPlane(3) As Direct3D.CustomVertex.PositionNormalTextured '存放顶点位置的数组
#Region "DX Core"
Public Sub InitDeviceObjects()
With d3dpp ‘以下请照抄。
.Windowed = True ‘不全屏。
.SwapEffect = Direct3D.SwapEffect.Discard ’双缓冲交换效果。请百度“双缓冲”
.BackBufferFormat = Direct3D.Format.Unknown
.EnableAutoDepthStencil = True ’让DX自动管理深度缓冲
.AutoDepthStencilFormat = Direct3D.DepthFormat.D16
End With
MyDevice = New Direct3D.Device(0, Direct3D.DeviceType.Hardware, Me.Handle, Direct3D.CreateFlags.HardwareVertexProcessing, d3dpp) '创建DX设备啦!以下两句请照抄。
MyDevice.SetRenderState(Direct3D.RenderStates.ZEnable, True) ‘Z缓冲
MyDevice.SetRenderState(Direct3D.RenderStates.NormalizeNormals, True)'法线归一化,请看相关数学书籍。
End Sub
Public Sub RestoreDeviceObjects()
Dim PlaneIB() As Short = {0, 1, 3, 0, 2, 3} ’顶点索引信息。
Dim AttrTable(1) As Direct3D.AttributeRange ‘顶点分组属性表
AttrTable(0).AttributeId = 0
AttrTable(0).FaceStart = 0
AttrTable(0).FaceCount = 2 ’有两个三角形
AttrTable(0).VertexStart = 0
AttrTable(0).VertexCount = 4 ‘四个点
‘顶点坐标信息。
VBPlane(0) = New Direct3D.CustomVertex.PositionNormalTextured(-500, -500, 0, 0, 0, 1, 0, 0)
VBPlane(1) = New Direct3D.CustomVertex.PositionNormalTextured(500, -500, 0, 0, 0, 1, 1, 0)
VBPlane(2) = New Direct3D.CustomVertex.PositionNormalTextured(-500, 500, 0, 0, 0, 1, 0, 1)
VBPlane(3) = New Direct3D.CustomVertex.PositionNormalTextured(500, 500, 0, 0, 0, 1, 1, 1)
MyPlane = New Direct3D.Mesh(2, 4, Direct3D.MeshFlags.Managed, Direct3D.VertexFormats.Position + Direct3D.VertexFormats.Normal + Direct3D.VertexFormats.Texture1, MyDevice) ’创建物体
MyPlane.SetVertexBufferData(VBPlane, Direct3D.LockFlags.None) ‘输入顶点坐标数据
MyPlane.SetIndexBufferData(PlaneIB, Direct3D.LockFlags.None) ‘输入索引数据
MyPlane.SetAttributeTable(AttrTable) ‘输入顶点分组属性表
End Sub
Public Sub Render() ‘调用它画图
Dim vlook As New Vector3(1, 0, 0)
Dim vPos As New Vector3(0,0,0)
Dim vUp As New Vector3(0, 0, 1)
MatView = Matrix.LookAtLH(vPos, vlook, vUp) ‘计算摄像机位置矩阵
Device.SetTransform(Direct3D.TransformType.View, MatView) ‘设置当前摄像机位置矩阵为MatView。
Dim fAspect As Single = Me.Width / Me.Height ’窗口长宽比
matProj = Matrix.PerspectiveFovLH(Math.PI / 4, fAspect, 1.0F, 10001) ‘计算透视矩阵MatProj。
MyDevice.SetTransform(Direct3D.TransformType.Projection, matProj) ‘设置当前透视矩阵为MatProj。
MyDevice.Clear(Direct3D.ClearFlags.Target + Direct3D.ClearFlags.ZBuffer, Color.Blue, 1.0F, 0) ’先刷蓝屏
MyDevice.BeginScene() ‘开始画
MatWorld = Matrix.Identity ’物体位于原点,不旋转
Device.SetTransform(Direct3D.TransformType.World, MatWorld) ’设置物体位置
Me.Mesh.DrawSubset(0) ‘画物体
MyDevice.EndScene() ’结束
MyDevice.Present() ‘显示在屏幕上
End Sub
Public Sub DeleteDeviceObjects() ’结束程序时放掉资源
MyPlane.Dispose()
MyDevice.Dispose()
End Sub
#End Region
Private Sub FormMain_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
DeleteDeviceObjects()
Windows.Forms.Cursor.Show()
End Sub
Private Sub FormMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
InitDeviceObjects()
RestoreDeviceObjects()
Windows.Forms.Cursor.Hide()
Render()
End Sub
End Class
在vb.net环境下图像处理,用什么建立3D
首先,还是谈谈图像像素时数据获取方面吧,.net中的图像相关类基本上都是基于GDI+的,因此,图像数据的获取其实也是调用GDI+的一些函数。这个函数就是LockBits,在vb.net中彩色图像数据的快速获取 一文中,我们是调用了Marshal.Copy把LockBits锁定的内存数据拷贝到数据中,然后对数组中的值进行处理。这样做主要的原因是VB.NET不好直接访问内存(Marshal.ReadByte之类的函数不适合用于大型的循环中)。那么,这就造成了2个不好的事情,第一:在同一时间需要2倍于图像数据量的内存,第二:内存数据拷贝到数据,以及处理后再把数组的数据拷贝会内存中都是会减低速度的。作为一种改进,我们应该充分利用LockBits的功能。LockBits中的LockMode中有一种模式为ImageLockMode.UserInputBuffer,该模式下需要用户先申请内存,然后在把图像数据按照相关格式填充如这个内存中。这样,就可以先定义个数组,然后把图像数据填充到这个数组中,就避免了来回拷贝的耗时了,简单示例代码如下:
Dim BmpData As New BitmapData
Stride = ((Bmp.Width * 3 + 3) And HFFFFFFFC)
Dim PixleValue(Stride * Bmp.Height) As Byte
Dim Hanlde As GCHandle = GCHandle.Alloc(PixleValue, GCHandleType.Pinned)
BmpData.Scan0 = Hanlde.AddrOfPinnedObject()
怎么利用VB.NET实现三维绘图
数学上不是有斜二测画法,算好坐标即可画出
或者用AnyCAD的.Net图形控件
也可以调用matlab 实现
三维二次开发那种语言最快
SOLIDWORKS二次开发介绍
一、 SOLIDWORKS的二次开发是建立在软件提供的API函数的基础上的,SOLIDWORKS的API对象结构是一个自上而下的多层树型网络结构,在二次开发过程中,COM编程允许SOLIDWORKS将实际的对象函数功能与外部世界联系,提供给设计人员开发使用,而VB.Net程序语言将COM编程的复杂性降低,使得设计人员在编译时,既可以在上层对象中寻找函数和方法,也可以面向子类对象调用其函数完成设计。
二、 SOLIDWORKS二次开发其实就是使用API函数来替代SOLIDWORKS设计中一些重复繁琐的工作,起到辅助设计的作用。
三、 SOLIDWORKS二次开发多使用VBA、VB.NET、C#.NET、C++等语言,每种语言都有自己的优势所在,这里仅做一个简单的介绍。
1、C#.NET:C#和VB.NET优势几乎差不多,但是C#和SOLIDWORKS自带宏程序语言与VBA有些不同,不适合前期入门的人员选择。
2、C++:C++语言有些难度,不是太适合常规的SOLIDWORKS二次开发编写,不建议使用。
3、VBA:VBA语言是SOLIDWORKS软件自带的一种宏语言,可以通过SOLIDWORKS自带宏功能打开,方便快捷。但是VBA语言不适合系统软件的开发,且在编程时没有错误提示。
4、VB.NET: VB.NET语言,许多语言和VBA相似,宏录制后方便编程人员的修改应用且可以作为系统软件开发语言,以Visual Studio作为开发平台。
本文名称:vb.net开发三维 vb三维绘图
文章地址:http://scyanting.com/article/ddcejhp.html