加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

用VB和TV3D轻松制作3D游戏教程5 场景的制作与读取

(2011-12-28 17:53:34)
标签:

tv3d

3d游戏制作

vb

教程

制作3d游戏

杂谈

分类: 程序教程

5 场景的制作与读取

一般3d游戏的场景都是用3dmax制作的,如果你会再好不过,如果不会也可以自学一点,至少能够使用现成模型也好。网上的场景模型还是很多的,我就随便用3dmax做了个场景示范一下。

模型做好后要导出成tv3d支持的格式,6.5中将场景格式统一加密成后缀为tvm的文件,将带动作的模型统一加密成后缀为tva的文件。你可以导出成3ds格式然后再用modelconverter进行转化,也可以用导出插件直接导出成tvm格式。

1、导出成3ds格式就不说了,导出后运行6.5目录下的tools\modelconverter\Converter-GUI.exe

如果无法打开,说明你的电脑没装net framework,下载安装即可,这也是我为什么不喜欢用.net编程的原因,现在装了net framework的电脑还是少数,而且它的体积还如此之大,很不方便。

点右边的Browse,选择刚才的3ds文件,如图配置即可。

http://s11/middle/6374fbb1hb523fef0f13a&690场景的制作与读取" TITLE="用VB和TV3D轻松制作3D游戏教程5 场景的制作与读取" />

2、6.5目录下,plugins文件夹下有各个软件的导出插件。

比如你用3dmax8,就把plugins\3dsmax 8.0目录下的TV3DExport.dle放到3dmax目录下的plugins文件夹中即可。

另外还需要把6.5的sdk\cppdll\tv3d65.dll拷贝到3dmax的根目录下
然后就可以导出tvm,tva格式了,导出tvm如下设置即可。
http://s3/middle/6374fbb1hb52415f6b932&690场景的制作与读取" TITLE="用VB和TV3D轻松制作3D游戏教程5 场景的制作与读取" />

 

由于需要观看场景了,所以我们还是把窗口弄大些,比如把窗口的height值设为9480,width值设为12120.基本上这就是800*600像素的大小。

读取的代码:

Mesh.LoadTVM "123.TVM"

最后别忘了渲染。
 Mesh.Render
 不过我们还是改用Scene.RenderAll True了,因为这样就全部都渲染了,省的忘记。

效果如图,如果需要例子中的场景可以到http://115.com/file/beliibw8#下载,解压放在游戏目录中:

http://s8/middle/6374fbb1hb524317e58f7&690场景的制作与读取" TITLE="用VB和TV3D轻松制作3D游戏教程5 场景的制作与读取" />
全部代码如下:

Option Explicit

Dim Tv As New TVEngine '调用tv3d所必需的

Dim Scene As New TVScene '调用tv3d所必需的

Dim Mesh As TVMesh '添加一个网格物体
Dim Inp As New TVInputEngine

Dim TF As New TVTextureFactory '添加一个贴图库
Dim MF As New TVMaterialFactory ''添加一个材质库
Dim LE As New TVLightEngine '添加一个灯光库

Dim Mx As Long, My As Long, B1 As Boolean, B2 As Boolean, Roll As Long   '接收鼠标信息

Dim Camera As New TVCamera '定义一个摄像机,相当于人的眼睛
Dim CameraPozX As Single, CameraPozY As Single, CameraPozZ As Single '摄像机位置坐标
Dim CameraAngX As Single, CameraAngY As Single '摄像机角度

 Dim Atmos  As New TVAtmosphere '添加大气系统

 

Private Sub Form_Load()

Me.Show '显示当前窗口,每次都加上错不了
  Tv.SetDebugFile App.Path & "\debugfile.txt"
  Tv.SetDebugMode True, True
Tv.SetSearchDirectory App.Path '设定贴图读取目录为当前目录
 Tv.SetVSync True '垂直同步开关
Tv.Init3DWindowed Form1.hWnd '用窗口模式启动tv3d
Inp.Initialize
Tv.SetAngleSystem TV_ANGLE_DEGREE
   Scene.SetViewFrustum 45, 20000 '可视范围200米 100单位=1米

 

TF.LoadTexture "pic.jpg", "pic" '读取名为pic.jpg的贴图,并命名为pic
 
 
     TF.LoadTexture "Back.jpg", "SKYBOX_Back" '读取天空背景
    TF.LoadTexture "Front.jpg", "SKYBOX_Front"
    TF.LoadTexture "Left.jpg", "SKYBOX_Left"
    TF.LoadTexture "Right.jpg", "SKYBOX_Right"
    TF.LoadTexture "Up.jpg", "SKYBOX_Up"
    TF.LoadTexture "down.jpg", "SKYBOX_DOWN"

  Atmos.SkyBox_Enable True '开启天空盒
Atmos.SkyBox_SetTexture GetTex("SKYBOX_Front"), GetTex("SKYBOX_Back"), GetTex("SKYBOX_Left"), GetTex("SKYBOX_Right"), GetTex("SKYBOX_Up"), GetTex("SKYBOX_DOWN") '设定贴图


 
 Atmos.Fog_Enable True  '开启雾
Atmos.Fog_SetColor 1, 1, 1   '颜色RGBA,例如红
Atmos.Fog_SetParameters 10, 60, 0              '最近距离,最远距离,浓度
Atmos.Fog_SetType TV_FOG_LINEAR, TV_FOGTYPE_PIXEL   '雾的类型
 
 
MF.CreateMaterial "solid" '建立名为solid的材质
MF.SetAmbient GetMat("solid"), 0.1, 0.1, 0.1, 1       '环境光
MF.SetDiffuse GetMat("solid"), 1, 1, 1, 1 '扩散光,即物体的固有颜色
MF.SetEmissive GetMat("solid"), 0, 0, 0, 1  '自发光
MF.SetOpacity GetMat("solid"), 1 '不透明度
MF.SetSpecular GetMat("solid"), 1, 1, 1, 1   '高光色
MF.SetPower GetMat("solid"), 60 '散射强度

LE.CreateDirectionalLight Vector(1, -1, 1), 1, 1, 1, , 1  '添加一个平行光

 LE.SetSpecularLighting True '高光开关
 
 
Set Mesh = Scene.CreateMeshBuilder '网格物体初始化,必加
 
 

Mesh.LoadTVM "123.TVM", True, True
Mesh.SetLightingMode TV_LIGHTING_NORMAL
Mesh.SetMaterial GetMat("solid")
 
 Do '主循环
 
 
 
  Inp.GetMouseState Mx, My, B1, B2, , , Roll           '接收鼠标信息
  
    CameraAngX = CameraAngX - 0.1 * Mx
    CameraAngY = CameraAngY - 0.1 * My
 
    '限制范围
     If CameraAngY > 90 Then CameraAngY = 90
     If CameraAngY < -90 Then CameraAngY = -90
    
    If Inp.IsKeyPressed(TV_KEY_Q) Then CameraPozY = CameraPozY + 0.1
    If Inp.IsKeyPressed(TV_KEY_E) Then CameraPozY = CameraPozY - 0.1
    If Inp.IsKeyPressed(TV_KEY_W) Then CameraPozZ = CameraPozZ + 0.1
    If Inp.IsKeyPressed(TV_KEY_S) Then CameraPozZ = CameraPozZ - 0.1
    If Inp.IsKeyPressed(TV_KEY_A) Then CameraPozX = CameraPozX + 0.1
    If Inp.IsKeyPressed(TV_KEY_D) Then CameraPozX = CameraPozX - 0.1
'设定摄像机
Camera.SetRotation CameraAngY, CameraAngX, 0
Camera.SetPosition CameraPozX, CameraPozY, CameraPozZ

 
 Tv.Clear '清屏
 Atmos.Fog_Enable False
  Atmos.Atmosphere_Render '渲染大气
 Atmos.Fog_Enable True
 Scene.RenderAll True
 Tv.RenderToScreen '把所得最终结果渲染到屏幕

DoEvents '这句是把线程空出来,使其他的的程序能运行,必加

Loop

 

End Sub


 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有