扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
想系统的学习,需要的东西太多太多了。想花个几个月就能做出个游戏可以学学Unity3d,是个完整的游戏引擎,用户可以写脚本来实现游戏逻辑,挺好。
主要从事网页设计、PC网站建设(电脑版网站建设)、wap网站建设(手机版网站建设)、成都响应式网站建设、程序开发、微网站、小程序开发等,凭借多年来在互联网的打拼,我们在互联网网站建设行业积累了丰富的网站设计制作、做网站、网络营销经验,集策划、开发、设计、营销、管理等多方位专业化运作于一体,具备承接不同规模与类型的建设项目的能力。
工具类型:游戏开发引擎
开发小组:Truevision3D LLC
最新发布版本: Truevision3D 6.2
引擎介绍:
Truevision3D引擎是美国的一个共享引擎,在国外的共享3D引擎中,Truevision3D引擎(以下简称TV3D)的口碑还是很不错的!由于TV3D的网站访问速度过于缓慢,而且要下载SDK,网站还不提供断点续传功能!所以特地放上TV3D完整开发SDK和TV3D的一些资料。
支持的开发语言:
支持Visual Basic 6.0
支持Visual C++ 6.0
支持Delphi 6、7、8
支持Visual Studio .NET(C#、Visual Basic .NET)
引擎特征:
1。适合快速开发,这里的快速开发的意思是快速搭建3d程序,它只是简化了3d程序或者游戏的制作周期。
2。完全支持 DirectX8.1和DirectX9
3。支持硬件 TL技术(用于实现动态水面效果)
4。DirectX硬件灯光渲染(这里有个它的缺点,在下面说)
5。支持BSP地图格式,支持3DS, X, MDL, MD2, MD3模型格式
6。优化顶点渲染
7。支持动画材质脚本系统
8。大自然环境支持烟雾、动态的云、天空(天空盒)、星星
9。支持DOT3纹理帖图(就是凹凸帖图,Dump Texture,Doom3最常用的一种技术)
10。支持物体的动态阴影(这个功能感觉很费CPU)
11。支持2D渲染(我游戏中的平面UI就是用这个接口做的)
12。支持高级碰撞检测
13。动画系统。
首先,还是谈谈图像像素时数据获取方面吧,.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的就是tv3d引擎了,包含了你所说的3D、光线、物理。
你百度查一查vb+tv3d就知道了。
可以借助DirectX来编程。免费3D引擎可不好找,一般来说速度比不上硬件加速后的DX,尤其令人头疼的是一般都没有针对VB的文档,LZ有这方面理想的话,自己写一个吧……
我不得不承认在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
其实做3D游戏大部分都是代码,3Dmax只是做模型的。用程序贴上材质。+759812246。这里推荐下truevision3d 3D引擎。有很多中文教程 贴上最简单的源码:忘了说,用vb6.0
Private TV As TVEngine '声明TV3D引擎对象
Private Scene As TVScene '声明场景TVScene对象
Private Mesh As TVMesh '声明网格TVMesh对象
Private InputE As TVInputEngine '声明输入(键盘、鼠标)对象
Private Sub Form_Load()
Set TV = New TVEngine '定义TV对象为TVEngine类的一个实例
TV.Init3DWindowedMode Form1.hWnd '调用TV3D的一个函数Init3DWindowedMode,初始化3D窗口。参数是当前窗口的句柄
Set InputE = New TVInputEngine '定义InputE对象为TVInputEngine类的一个实例
Set Scene = New TVScene '定义Scene对象为TVScene的一个实例
Set Mesh = Scene.CreateMeshBuilder '定义Mesh对象为TVMesh的一个实例,用Scene的CreateMeshBuilder方法生成
Scene.SetSceneBackGround 1, 0, 0 '设置背景颜色
Mesh.CreateTeapot '建立茶壶模型
Mesh.SetPosition 0, 0, 10 'Z越小,图像越大
Form1.Show
Do '开始进入游戏循环
DoEvents '用DoEvents函数,让Windows空出来作别的事
TV.Clear '清除缓冲区的内容
Mesh.Render '渲染Mesh(3D物件)
TV.RenderToScreen '把缓冲区的内容渲染到屏幕上
Loop Until InputE.IsKeyPressed(TV_KEY_ESCAPE) '直到用户按下了Esc,游戏终止运行
Set Mesh=Nothing
Set Scene=Nothing
Set InputE = Nothing '释放InputE对象所占用的内存空间
Set TV = Nothing '释放TV对象所占用的内存空间
End '程序结束
End Sub
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流