|
|
基于游戏引擎的3D图形系统的研究
冉春玉 张 浩 薛 果 周 鹏
摘 要:游戏引擎是一个处理游戏底层技术的平台,使用游戏引擎,游戏开发人员可以不用花过多精力去处理系统架构、内存管理、图像绘制等一些底层的技术。3D引擎是游戏引擎中的子引擎,负责3D图形绘制功能。本文通过设计3D引擎的架构,对3D图形系统进行分析和研究。
关键词:3D引擎 变换 图形系统
中图分类号:TP311.1 文献标识码:A 文章编号:1006-7973(2006)2-0050-02
一、3D游戏引擎的一般功能组成
三维图形系统:它是引擎最重要的功能之一,负责处理3D世界的数据结构以及从玩家或相机所在的视点渲染3D世界。三维图形系统在引擎的所有部件当中是最复杂的,它的强大与否直接决定着最终的输出画面质量。
动画系统:目前游戏所采用的动画系统可以分为两种:一是骨骼动画系统,一是模型动画系统,前者用内置的骨骼带动物体产生运动,后者则是在模型的基础上直接进行变形。
物理系统:物理系统控制物体的运动遵循固定的规律。
输入控制模块:负责玩家与电脑之间的沟通,处理来自键盘、鼠标、摇杆和其它外设的信号。
音效模块:处理游戏世界所有音效,包括背景音乐和各种事件声音的管理和播放。
人工智能模块:为游戏中的非玩家控制角色的行为和决策提高智能支持。
二、构建3D流水线
下面将介绍构建一个3D线框引擎的主要过程,它能够以独立的方式或通过加载磁盘文件中的物体来定义多边形,进而渲染它们。另外,通过编写各种变换函数,可以创建各种3D流水线。
1.局部坐标到世界坐标变换
局部坐标,也叫模型坐标,是3D实体在其局部坐标系中的坐标。建立好所有的3D模型后,要将其放置到世界坐标系中。世界坐标表示虚拟宇宙中的实际位置,物体将在虚拟宇宙中移动和变换。世界坐标表示的是绝对位置而不是相对位置。
首先要确定世界坐标表示的范围,除模型大小外,还需要考虑缩放变换和相机变换等因素,因此经常需要调整宇宙中空间的大小,使之与游戏物体的大小、速度和缩放比例匹配。
给定用局部坐标表示的物体顶点列表,要将其变换为世界标准,要知道将物体的中心放到世界坐标的什么位置,然后将局部坐标原点平移到这个位置。
2.相机模型
相机模型并非是3D流水线中的步骤,但是流水线的后续步骤依赖于相机模型。相机模型分为欧拉相机模型和UVN相机模型。无论使用哪种相机模型,都需要视距、视野、远近裁减面,一定宽度和高度的视口(表示实际的光栅窗口)。
3.世界坐标到相机坐标变换
世界坐标到相机坐标的变换指的是对世界坐标系进行移动,使得相机位于世界坐标系的原点,镜头指向+Z轴方向;这种变换分为:平移和旋转。
首先进行平移,平移以后的结果是,相机位于世界坐标系的原点,物体相对于相机的位置保持不变,但相机的观察角度为(0,ang_y,0)。要使相机的朝向与+Z轴重合,我们必须将相机绕Y轴旋转-ang_y,同时对所有的物体顶点也要绕Y轴旋转-ang_y。这样物体与相机之间的相对位置保持不变,只有物体再世界空间中的绝对位置发生了变化。
然而如果是一般性角度(ang_x,ang_y,ang_z,),必须执行3次旋转:一次绕y轴,称为Rcamy-1;然后绕x轴,称为Rcamx-1;再绕z轴,称为Rcamz-1;旋转角度必须是相机角度的逆。
4.物体剔除
物体剔除指的是将物体删除,以免在整个流水线中对其进行处理。物体剔除可以在世界空间中进行,也可以在相机空间中进行。这是3D引擎流水线中最重要的步骤,因为在大多数情况下,只有几个物体位于场景中,其他物体要么在视野范围外,要么在观察者后面,不需要对他们处理。
物体剔除采用包围球测试的原理:对世界空间中的每个物体,创建一个将其包围起来的球体。然后只对球心(单个点)执行世界坐标到相机坐标变换,并判断球体是否位于视景体内,如果不在视景体内则丢弃它包围的整个物体。接下来,执行背面消除,并对余下的不是背面且在视景体内的多边形执行世界坐标到相机坐标的变换。如果球体的一部分在视景体内,再进行其他的测试。
5.背面消除
背面消除指的是删除背向视点的多边形。这种测试通常是在世界空间而不是相机空间进行,这样可通过背面消除删除大量的多边形,避免对它们进行世界坐标到相机坐标变换。因此背面消除要在物体剔除之后和世界坐标到相机坐标变换之前进行。
背面测试的工作原理:以统一的方式,顺时针或逆时针都可以,对构成每个物体的所有多边形进行标记,然后计算每个多边形的面法线ns,并根据观察向量v对这条法线进行测试,如果面法线和观察向量之间的夹角不超过90度,则多边形对观察者而言是可见的。
6.相机坐标到透视坐标变换
透视坐标到屏幕坐标变换是指将视平面映射到屏幕,是3D流水线的最后一个阶段。它将视平面坐标进行缩放,变成屏幕坐标。而且,大多数光栅屏幕的原点位于左上角,y轴的方向与标准2D笛卡尔坐标系相反。当然,如果在透视变换中,视平面的大小与视口相同,则无需执行缩放操作,但在大多数情况下,需要执行平移,并反转y轴,因为在投影时,我们假设视平面的中心为原点,其+x轴指向右方,+y轴指向上方,而光栅屏幕的原点位于左上角,y轴方向与此相反。因此,无论在什么情况下,都需要执行某种形式的视口变换。
三、3D引擎的应用
下面实现了一个战区漫步的演示程序。实现这个程序需要包含上面的3D引擎函数库。
1.加载和初始化物体
// 加载主坦克拷贝
VECTOR4D_INITXYZ(&vscale,0.75,0.75,0.75);
Load_OBJECT4DV2_PLG(&obj_tank,"tank3.plg",&vscale,&vpos,&vrot);
//加载玩家的坦克模型
VECTOR4D_INITXYZ(&vscale,15.75,15.75,15.75);
Load_OBJECT4DV_COB(&obj_player,"tie04.cob",
&vscale,&vpos,&vrot,VERTEX_FLAGS_INVERT_TEX TURE_V
|VERTEX_FLAGS_SWAP_YZ | VERTEX_FLAGS_TRANSFORM_LOCAL_WORLD);
// 加载主高塔
VECTOR4D_INITXYZ(&vscale,1.0,2.0,1.0);
Load_OBJECT4DV_PLG(&obj_tower,"towerg1.plg",&vscale,&vpos,&vrot);
// 加载主地面标记拷贝
VECTOR4D_INITXYZ(&vscale,3.0,3.0,3.0);
Load_OBJECT4DV_PLG(&obj_marker,"marker2.plg",&vscale,&vpos,&vrot);
2.相机系统
// 初始化相机系统,
Init_CAM4DV1(&cam,// the camera object
CAM_MODEL_EULER,// the euler model
&cam_pos, // initial camera position
&cam_dir, // initial camera angles
&cam_target, // no target
200.0, // near and far clipping planes
12000.0,
120.0, // field of view in degrees
WINDOW_WIDTH, // size of final screen viewport
WINDOW_HEIGHT);
3.产生游戏世界
游戏世界由大量静态物体组成,这些物体是通过复制主物体得到的,它们被放置在游戏世界中固定位置上,各个物体是通过重新指定主物体的位置,对其进行变换并插入到主多边形渲染列表中来创建的。
// 将高塔插入到游戏世界中
for (index = 0;index < NUM_TOWERS;index++)
{
// 设置高塔的位置
obj_tower.world_pos.x = towers[index].x;
obj_tower.world_pos.y = towers[index].y;
obj_tower.world_pos.z = towers[index].z;
// 物体剔除操作
if (!Cull_OBJECT4DV(&obj_tower,&cam,CULL_OBJECT_XYZ_PLANES))
{
// 如果物体可见,将其插入渲染列表中
// 执行局部坐标到世界坐标变换
Model_To_World_OBJECT4DV(&obj_tower);
// 将物体插入到渲染列表中
Insert_OBJECT4DV_RENDERLIST4DV(&rend_list, &obj_tower,0);
} // end if
} // end for
四、总结
尽管游戏引擎技术在国内发展还是刚刚起步,技术还不够成熟,其完善也需要一段时间,但是随着中国游戏产业迅速发展,游戏引擎市场逐渐成为一个新兴的增值亮点,必将得到越来越广泛的应用。
参考文献
[1] http://www.gamedev.net/reference/programming/ features/ xfilepc/
[2] Ian Parberry’s.Learn Computer Game Programming with DirectX7.0.Wordware Publishing.Inc.
[3] 陈为,周骥,杨珂,邹林灿.面向对象的游戏开发.北京.电子工业出版社.2005.
[4] Frank Luna.“Introduction to 3D Game Programming with DirectX 9.0”.Wordware Publishing.2003
|
|