XNA开发实用教程——三维模型的导入及操作
三峡大学土木水电学院肖泽云
本教程的主要目的是让你看完后,真正体会一下什么是XNA?XNA中主要包括哪些部分?相信你自己,在看完整个教程后,你也能设计自己的三维场景!祝你成功!
五、三维模型的导入及操作
三维场景需包括的有模型、摄像机、灯光等。
在此以FBX格式的模型文件为例,首先建模型我们选择3DMAX平台,然后安装FBX格式转换插件,如下图所示。
1、在3DMAX中建立一个模型,如下图所示。
2、然后以FBX格式导出,如下图所示,该文件名为MyModel01.FBX。
3、在弹出的输出FBX窗口上设置相关参数,如下图所示。
4、将拖到新建的游戏项目解决方案中的Content目录中,如下图所示。
5、在全局变量定义中定义如下:
Model myModel; //定义模型
Vector3 modelpositon = Vector3.Zero;//定义模型的位置
Vector3 camerapositon = new Vector3(500, 500, 500); //定义摄像机的位置
Vector3 cameraLookAt =Vector3.Zero; //定义摄像机目标的位置
Matrix cameraprojectionMatrix; //定义摄像机投影矩阵
Matrix cameraviewMatrix; //定义摄像机视图矩阵
6、在LoadContent()函数中添加导入模型代码:
myModel = Content.Load<Model>("MyModel01");
7、定义函数CamaraUpdata(),用于更新摄像机,代码如下:
void CamaraUpdata()
{
cameraviewMatrix = Matrix.CreateLookAt(camerapositon, cameraLookAt, Vector3.Up); //设置摄像机视图矩阵为从摄像机到摄像机目标,向上
cameraprojectionMatrix = Matrix.CreatePerspectiveFieldOfView(
MathHelper.ToRadians(60.0f),
graphics.GraphicsDevice.Viewport.AspectRatio, 1.0f, 1000.0f); //设置摄像机投影矩阵,用于控制摄像机的视角角度、视距等,如60.0f即为视角角度,1.0f和1000.0f分别为可见的最短距离和最远距离
}
8、定义函数DrawModel(),用于显示模型并设置模型的位置以及动画等,其代码如下:
void DrawModel(Model model, Vector3 modelPositon)
{
foreach (ModelMesh mesh in model.Meshes)//每个模型model中有很多网格mesh。
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.EnableDefaultLighting();
effect.PreferPerPixelLighting = true;
if (mesh.Name == "Box01")
effect.World = Matrix.CreateTranslation(modelpositon); //如果mesh的名称叫Box01,则设置它的世界坐标为前面定义的modelpositon矩阵,由于我们前面建模型的时候绘制的就是一个box,而且该box的名称就是Box01。
effect.Projection = cameraprojectionMatrix; //设置它的投影为摄像机投影矩阵
effect.View = cameraviewMatrix;//设置它的视图为摄像机视图
/*此外,还可以设置是否有雾等等,如下:
effect.FogEnabled = true;
effect.FogStart = 200;
effect.FogEnd = 500;
effect.FogColor = Color.CornflowerBlue.ToVector3();
*/
}
mesh.Draw();//绘制模型,即显示模型
}
}
9、在Draw()函数中添加如下代码,用于
CamaraUpdata();
DrawModel(myModel, modelpositon);
运行,其显示结果如下所示:
10、由于模型显示比较小,我们可以调整摄像机的位置来使得模型看上去大写,如更改全局变量定义中的camerapositon初始值为:
Vector3 camerapositon = new Vector3(0, 30,100);
其显示结果如下图所示:
11、下面我们结合Update()函数中的参数gameTime来设置随着时间变化的动画,如模型的移动。在此需要说明一下XNA中坐标的方向,其方向如下图所示:
现设置模型沿着X轴正向移动,只需要更改模型位置变量modelpositon的X值。如在DrawModel()函数中第一行就添加:
modelpositon.X = modelpositon.X+ 1;
其显示结果为:
若需要旋转摄像机,同样可以更改摄像机的位置参数,但是这些更改必须在Update()函数里面或它所镶嵌的函数里面。
至此,整个程序代码如下:
[Game1.cs]
#region Using Statements//引用
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;
#endregion
namespace ModelWindowsGame
{
public class Game1 : Microsoft.Xna.Framework.Game //继承Game类
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Model myModel; //定义模型
Vector3 modelpositon = Vector3.Zero;//定义模型的位置
Vector3 camerapositon = new Vector3(0, 30, 100); //定义摄像机的位置
Vector3 cameraLookAt = Vector3.Zero; //定义摄像机目标的位置
Matrix cameraprojectionMatrix; //定义摄像机投影矩阵
Matrix cameraviewMatrix; //定义摄像机视图矩阵
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
protected override void Initialize()//初始化
{
base.Initialize();
}
protected override void LoadContent()//导入目录,每次游戏启动时都会启动
{
// 创建一个精灵,用于绘制图片
spriteBatch = new SpriteBatch(GraphicsDevice);
myModel = Content.Load<Model>("MyModel01");
}
protected override void UnloadContent()//卸载目录
{
// TODO: Unload any non ContentManager content here
}
protected override void Update(GameTime gameTime)/// 更新。用于检测碰撞、输入等
{
// 设置游戏结束事件
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
//添加更新的对象代码
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)//当绘制时被调用
{
graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
// 添加绘图代码
CamaraUpdata();
DrawModel(myModel, modelpositon);
base.Draw(gameTime);
}
void CamaraUpdata()
{
cameraviewMatrix = Matrix.CreateLookAt(camerapositon, cameraLookAt, Vector3.Up); //设置摄像机视图矩阵为从摄像机到摄像机目标,向上
cameraprojectionMatrix = Matrix.CreatePerspectiveFieldOfView(
MathHelper.ToRadians(60.0f),
graphics.GraphicsDevice.Viewport.AspectRatio, 1.0f, 1000.0f); //设置摄像机投影矩阵,用于控制摄像机的视角角度、视距等,如60.0f即为视角角度,1.0f和1000.0f分别为可见的最短距离和最远距离
}
void DrawModel(Model model, Vector3 modelPositon)
{
//modelpositon.X = modelpositon.X+ 1; 设置模型的X方向位置随着时间增加
foreach (ModelMesh mesh in model.Meshes)//每个模型model中有很多网格mesh。
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.EnableDefaultLighting();
effect.PreferPerPixelLighting = true;
if (mesh.Name == "Box01")
effect.World = Matrix.CreateTranslation(modelpositon); //如果mesh的名称叫Box01,则设置它的世界坐标为前面定义的modelpositon矩阵,由于我们前面建模型的时候绘制的就是一个box,而且该box的名称就是Box01。
effect.Projection = cameraprojectionMatrix; //设置它的投影为摄像机投影矩阵
effect.View = cameraviewMatrix;//设置它的视图为摄像机视图
/*此外,还可以设置是否有雾等等,如下:
effect.FogEnabled = true;
effect.FogStart = 200;
effect.FogEnd = 500;
effect.FogColor = Color.CornflowerBlue.ToVector3();
*/
}
mesh.Draw();//绘制模型,即显示模型
}
}
}
}
12、前面的模型都没有贴图,为了使模型表面有贴图,在此以X模型格式为例。在3DMAX中添加插件PandaDirectXMaxExporter_x86.dle,将该插件主要是将模型导出为X格式。其下载地址为:http://www.andytather.co.uk/Panda/Files/3dsmax8/PandaDirectXMaxExporter_x86_5.8.66.0.zip,将该插件文件保存在3DMAX安装路径中plugins文件夹内,如:D:/Program Files/3dsmax8chs/3dsMax8chs/plugins
现在3DMAX中新建一个模型对象,然后为模型贴上图片,注意:该贴图的尺寸大小要求为2的n次方,如512*512,或256*256
输出该模型为X格式,如下图所示:
然后将该模型文件及模型贴图托到程序解决方案中Content文件夹内,如下所示:
现只需要将程序myModel = Content.Load<Model>("MyModel01");更改为myModel = Content.Load<Model>("Xmodel01");启动调试后如下图所示:
13、前面介绍了模型中使用贴图,但很快我们发现,在3DMAX中建的模型导出后其贴图比例大小变了。举例说,如果一个平面由10个相同的贴图A组成,在3DMAX中通过更改材质的大小尺寸即可,但是导出这个平面后,该平面是由一个贴图A组成的,这是由于在导出模型的时候,默认同时导出的贴图为使用的贴图,并没有尺寸缩放等。下面介绍一种方法来解决这类问题:
1)首先在3DMAX中建立一个面,如本例中使用贴图如下图所示:
2)设置材质参数,如下图所示,并赋给平面:
3)该面贴图后如下图所示:
4)在菜单栏上选择“渲染——渲染道纹理…”,如下图所示,对面进行烘焙:
5)烘焙的参数设置如下图所示,点击渲染按钮,开始烘焙:
6)在材质面板中新建一个材质球,其贴图为刚才烘焙导出的贴图,并将该材质赋给平面,如下图所示:
7)若导出模型格式为FBX,则需要将平面模型转换成可编辑网格。选中要导出的模型,然后选择菜单“文件——导出选定对象…”,选择输出模型的格式(FBX或X格式皆可)。
分享到:
相关推荐
wp7 xna开发最强教程,让你最快的学习xna开发,能够写出一个小的游戏。
XWinForm(XNA2.0)——XNA虚拟WinForm窗体 XWinForm(XNA2.0)——XNA虚拟WinForm窗体 XWinForm(XNA2.0)——XNA虚拟WinForm窗体
XNA 三维设计。三维设计基本概念。简单3D图形的绘制。3D模型与3D特效。第一人称摄像机和第三人称摄像机等等。
使用vs2008开发环境,基于xna3.0,导入一个模型并且把显示的画面输出到指定的Form所划出的pannel中。实现了导入3d模型并调用winform的双重功能
XNA平台游戏开发中文教程,对于入门来说是不可多得的靓文.
xna游戏的开发介绍以及编程代码 是学习xna开发的必读之书
是大学xna教材,这是入门级的,对于xna入门者来说,可以参阅的
XNA开发简单教程,熟悉vs2010开发环境及XNA框架
XWinForm——XNA虚拟WinForm窗体 XWinForm——XNA虚拟WinForm窗体 XWinForm——XNA虚拟WinForm窗体 XWinForm——XNA虚拟WinForm窗体
XNA导入VS_2008XNA导入VS_2008方法
Microsoft 的 XNA 游戏开发 资料。
Windows Phone提供了两种不同的用户界面编程模型:Silverlight 和 XNA。Silverlight是最常用的应用程序开发方式,应用程序可以使用控件、显示很多数据。XNA是2D和3D游戏开发方式。当年您也可以使用Silverlight来写...
国内第一本XNA教程中文《XNA入门指南》,经《A Beginners Guild to XNA》原作者 Mike Fleischauer 书面授权中国XNA开发网翻译!书中如有错误请访问www.ChinaXNA.com 或者 www.XNADev.cn
XNA Game Studio Express 是专业跨平台整合型游戏开发套件「XNA Studio」的简化版
基于XNA框架开发的连连看小游戏,使用C#语言
XNA中文教程(共四章,内含代码)XNA中文教程(共四章,内含代码)
很好的物理效果 用C#-XNA开发的物理效果引擎谁说C#不能做游戏了! 用这个完全可以做出像<粘粘世界><蜡笔物理学>这样的物理学游戏 : D
XNA概述 加载资源 更新坐标 显示模型
Xna游戏编辑器框架——WinForm内嵌Xna
Direct 3D与XNA游戏开发源码,很优秀的书,很优秀的源代码。