-1-
基于 XNA的 3D漫游框架
张涛,史文彦,谢步瀛
同济大学 土木工程学院建筑工程系,上海 (200092)
摘 要:三维可视化仿真技术是研究热潮。本文对基于 XNA的 3D 漫游程序框架进行了研
究,介绍了 XNA程序的基本流程,模型的导入和位置的设置及相机位置和视域体的设置,
加入了人机交互的键盘响应、产生漫游沉浸感的音效、碰撞检测。从效果和效率上可以看出
用 XNA开发漫游平台是比较可取的技术路线。
关键词:XNA DirectX C# 3D 漫游
中图分类号:TP302
1.引言
三维可视化技术方兴未艾,从美国斯坦福大学的“数字米开朗基罗”计划、故宫博物院
和 IBM合作的“超越时空的1紫禁城”项目,到 3D游戏“魔兽世界”、3D电影“阿凡达”
等的风靡,可以说,个人计算机的广泛普及和相关软硬件行业的兴旺发达,很大程度上得益
于现代多媒体技术的广泛运用和蓬勃发展。本文研究了基于 C#和Microsoft XNA 游戏开
发平台的 3D漫游框架,可应用于三维仿真及虚拟漫游平台开发,是较为可取的技术路线。
2.基本流程
XNA开发平台在底层仍旧使用 DirectX,所以要开发 XNA 3D程序的电脑的 DirectX版
本需高于 DirectX ,而运行 XNA 3D 程序的电脑同样需要装有.Net Framework 及
DirectX 以上版本。[1]
一个典型的 XNA 程序中方法执行的流程如图 1,这些方法在新建一个 XNA 程序时候
系统已经自动生成[2,3]。
本文研究背景为国家科技支撑计划“既有建筑综合改造关键技术研究与示范”子课题“历史建筑三维数字
仿真技术研究”(编号:2006BAJ03A07-07)。
图 1 典型 XNA程序执行流程
Game1
Run()
Initialize()
LoadContent()
Update()
Draw()
Exit() UnloadContent()
中国科技论文在线
-2-
从这些默认方法的名称可以看出它们的基本作用。Initialize方法作用是进行程序的初始
化;LoadContent 方法中可以用来加载图像精灵,三维模型,声音等内容;Update 方法和
Draw方法在程序中是反复调用执行的,一直到程序终止命令出现,Update方法用来处理程
序中相关对象的更改,比如移动、碰撞检测等,Draw就用来具体实现绘制的方法。
可以看到其实 XNA已经封装处理好了 3D图形处理复杂棘手的底层,比如显卡,声卡
的控制和交互等等[4,5],在此基础上程序员就可以腾出精力来专注于程序逻辑等的设计。这
正是 XNA的优点。这样,在 XNA的三维世界里得到一幅场景的两个基本性的考虑就是:
被漫游对象的设置和摄像机的设置。另外,为取得身临其境和逼真的效果,需要再加入音效
和碰撞检测。
3.模型和相机
现实中拍一张照片或者摄像一般过程是首先确定被拍摄的对象,接着摄影师设置摆放好
摄像机。3D 漫游时同样如此,模型可能会在世界坐标系里移动,摄像机也可能会有旋转和
位移,摄像机以一定帧率(XNA默认 60 fps)、在设置好的摄像机视锥体里摄入一帧图像,
连贯起来最后形成漫游。
载入 3D模型
首先载入 3D模型。在 XNA中使用的 3D模型类型一般为.X和.FBX文件,但 XNA本
身并不能创建这两类文件,它们可经由 3D Max,Maya 等软件来制作。此处假设已经制作
好的 3D模型名称为 ,先把这个文件加入到 XNA解决方案的 Content文件夹下。接
着在 Game1 类中依次为该模型声明一个装载模型文件的变量、标志模型位置的变量,为相
机声明标志相机位置的变量、标志相机摄取目标的变量如下:
Model myModel;
Vector3 modelPosition = ;
Vector3 cameraPosition = new Vector3(, , );
Vector3 cameraTarget = ;
接着在 LoadContent方法中为 myModel装载模型:
myModel = <Model>("model");
为便于管理和分类,之前也可把 加入到 Content文件夹下自建子文件夹里,假
如子文件夹名为Models,则上边的代码要相应改为:
myModel = <Model>("Models\\model");
一般的,模型设置位置就可以了,也可以为它设置旋转矩阵,但这样的效果同样可以通
过设置相机位置和目标朝向的移动及旋转来达到。
设置相机
设置相机采用如下方法:
(cameraPosition, cameraTarget, );
其中第三个参数是定义相机向上的方向,就如同摄像师决定是横着拿相机和竖着拿相机
一样。视锥体(视域)参数示意如图 2所示,将 3D模型显示在 2D屏幕上同时产生三维效
果,XNA 中有两种投影,分别是透视投影和正交投影,本文采用更符合人眼三维视觉的透
视投影,因此需要设置相机的视锥体:
(
fieldOfView, aspectRatio, nearPlaneDistance, farPlaneDistance);
中国科技论文在线
-3-
fieldOfView是相机能看到的弧度大小的视角,一般设置为 π/4。aspectRatio是相机视域
的宽高比,nearPlaneDistance和 farPlaneDistance分别为近端和远端距离。视锥体之外的物体
将不可视。依据实际模型的情况设定相应参数。
加入具体绘制代码
在以上各部分都设定好的情况下,需要在 Draw方法中加入绘制的具体语句。有些模型
由于构建比较复杂,它的构成采用了层次结构,可能一个模型(Model)会有多个网格(Mesh),
每个网格会有多个效果(Effect),这样模型移动旋转时它们之间的协调变化会以骨架(Bones)
控制。这种情况下需要加入以下语句来复制移动矩阵。
Matrix[] transforms = new Matrix[];
(transforms);
接着遍历模型的每个构成,打开默认光照,设置模型的世界坐标,代码如下:
foreach (ModelMesh mesh in )
{
foreach (BasicEffect effect in )
{
();
= transforms[]
*(modelPosition);
= (cameraPosition, cameraTarget, );
=
((),aspectRatio, , );
}
();
}
图 2 视锥体示意图[3]
中国科技论文在线
-4-
可以在 Update方法中为Windows漫游程序加入响应键盘输入的代码,比如:
if (().IsKeyDown())
cameraPosition += new Vector3 (0f,0f,-10f);
if (().IsKeyDown())
cameraPosition += new Vector3(0f, 0f, 10f);
以上代码的效果是使用户按一次W键时,相机位置向屏幕里边走进一定距离,按 S键
则相反。同样方法可以为相机设置向各个方向的移动及旋转。
4.加入音效
声音是产生漫游沉浸感的重要因素,在 XNA 中通过加入微软跨平台音频制作工具
(XACT)制作的漫游音效并非难事。
在 XACT中制作音频文件
在 XNA中运用 XACT通过名为 cue的对象调用音频。cue对象可以由一个或多个 sound
对象组成,而 sound对象由Wave Bank中一个或多个 .wav格式的音频文件构成。
首先把制作音频的.wav格式文件(假设为 )复制到漫游程序所在文件夹下
的 Content目录里。
XNA 默认已安装 XACT,可以从 Windows 开始菜单/Microsoft XNA Game Studio
Cross-Platform Audio Creation Tool (XACT)进入。在 XACT新建一个项
目,并把它命名为 myAudio同样保存到漫游程序所在文件夹下的 Content目录里。接着右击
Wave Banks新建一个Wave Bank,并采用默认名称(Wave Bank),同样的方法新建一个
Sound Bank。在Wave Bank中加入 myWave,然后再将Wave Bank中的文件拖进 Sound Bank
中的 Cue Name下,这就已经完成了音频文件的制作。如图 3。
如果音频在播放过程中需要不断循环,可以在相应 Sound Name 的属性框选中
Looping/Infinite完成设置。在 XACT中同样可以加入多种声音文件制作混合音频。
在 XACT中制作音频文件
音频文件制作好之后接下来在在 XNA 中加入音频播放代码。在 Game1 类中添加以下
变量:
图 3 XACT制作音频
中国科技论文在线
-5-
AudioEngine audioEngine;
WaveBank waveBank;
SoundBank soundBank;
Cue trackCue;
然后在 LoadContent中将变量实例化:
audioEngine = new AudioEngine(@"Content\ ");
waveBank = new WaveBank(audioEngine, @"Content\ Wave ");
soundBank = new SoundBank(audioEngine, @"Content\Sound ");
trackCue = ("myWave");
如果从一开始就播放音频,可以在 LoadContent中加入:
();
通过 trackCue同样可以控制声音的暂停和恢复等。
以上设置已经为漫游加入了背景音乐,运用不同音频文件的播放和设置可以为三维漫游
添加十分逼真到位的声音效果。
5.碰撞检测
在 XNA中进行碰撞检测同样简单[6,7]。比如有两个模型 model1和 model2,使用 3D碰
撞检测中最简单的 BoundingSphere 对象来进行碰撞检测,各自的世界坐标位置分别为
position1和 position2,根据两个模型的具体形状,设置两个比例系数 scale1和 scale2,使两
个 BoundingSphere 的半径分别是各自模型半径的一定大小,可以自建一个碰撞检测的方法
ModelsCollide如下:
private bool ModelsCollide (Model model1, Vector3 position1, float scale1, Model model2,
float position2, float scale2)
{
BoundingSphere boundingSphere1= new BoundingSphere (position1, model1. Meshes [0].
BoundingSphere. Radius * scale1);
BoundingSphere boundingSphere2= new BoundingSphere (position2, model2. Meshes [0].
BoundingSphere. Radius * scale2);
bool collision = (boundingSphere2);
return collision;
}
这样如果两个模型的 BoundingSphere相撞,ModelsCollide将返回 true,反之为 false。
6.结论
从本文的研究介绍可知用 XNA开发三维漫游程序时非常简单和方便,导入构建好的三
维.X或,FBX模型,或者直接利用 DirectX SDK中自带模型,加入充分的相机移动和旋转处
理,可以很简便快速地对目标模型进行各个角度的漫游。用 C#和 XNA 开发的效率比用传
统的 C/C++开发要高很多,可用于很多并非速度至上的图形渲染及三维漫游相关程序开发。
同样适合于中小型开发团队、游戏设计爱好者(比如微软 Xbox游戏开发),是新一代开发
利器,有很广阔的研究和发展前景。
中国科技论文在线
-6-
参考文献
[1] 叶思义,李震宇 XNA PC/Xbox360 C#游戏程式设计[M] 碁峰资讯, 2007
[2] XNA Game Studio Documentation [EB/OL], Microsoft
[3] Aaron Reed. Learning XNA [M]. O’Reilly, 2008
[4] Alexandre Santos Lobão, Bruno Evangelista, José Antonio Leal de Farias, et al. Beginning XNA Game
Programming From Novice to Professional [M]. Apress, 2009
[5] Benjamin Nitschke, Professional XNA Game Programming: For Xbox 360 and Windows[M] Wrox Press, 2007
[6] Riemer Grootjans, XNA Game Programming Recipes A Problem-Solution Approach[M] Apress, 2009
[7] [EB/OL]
Abstract view of 3D navigation framework based on XNA
Zhang Tao, Shi Wenyan, Xie Buying
Department of Building Engineering, Tongji University, Shanghai, PRC, (200092)
Abstract
Researches in 3D visualization and simulation are technically hot. This article had given an abstract
view in 3D navigation framework based on XNA. Basic procedure of XNA program, load of models
and its position setting, camera’s position and setting of view frustum were introduced, as well as
human-computer interaction of keyboard inputting, immersive sound effects and audio, and collision
detection. It was a practical technique route using XNA to develop 3D navigation framework from the
effect and efficiency.
Keywords: XNA DirectX C# 3D navigation
作者简介:张涛,男,1984年生,硕士研究生,主要研究方向建筑虚拟现实及仿真漫游。
中国科技论文在线