为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > 3D 游戏控制

3D 游戏控制

2018-08-15 10页 doc 27KB 20阅读

用户头像

is_594905

暂无简介

举报
3D 游戏控制3D 游戏控制 了解如何制作 3D 游戏控制 摘要 XNA 游戏使用的 3D 模型,以及于 XNA 游戏中显示 3D 模型的基本做法之后,这一次我们将要为大家介绍 3D 模型的控制技巧,包括旋转、放大/缩小、平移、以及相机控制等游戏常见的操作。有关如何制作 XNA 游戏使用的 3D 模型,以及于 XNA 游戏中显示 3D 模型的基本做法可以参考 [3D 游戏设计] 一文的详细说明。 3D 游戏设计基础 在执行控制与显示 3D 模型之前,首先我们必须了解以 XNA 为基础的 3D 游戏采用的坐标系统,表示坐标与控制坐标转换...
3D 游戏控制
3D 游戏控制 了解如何制作 3D 游戏控制 摘要 XNA 游戏使用的 3D 模型,以及于 XNA 游戏中显示 3D 模型的基本做法之后,这一次我们将要为大家介绍 3D 模型的控制技巧,包括旋转、放大/缩小、平移、以及相机控制等游戏常见的操作。有关如何制作 XNA 游戏使用的 3D 模型,以及于 XNA 游戏中显示 3D 模型的基本做法可以参考 [3D 游戏] 一文的详细说明。 3D 游戏设计基础 在执行控制与显示 3D 模型之前,首先我们必须了解以 XNA 为基础的 3D 游戏采用的坐标系统,示坐标与控制坐标转换常用的数据型态,并认识 Object Space、World Space、View Space、和 Screen Space 四种空间代表的意义与用途。 以 XNA 为基础的 3D 游戏采用的是右手坐标系统 (Right-Handed System),其X轴往右递增,Y 轴往上递增,而 Z 轴则是往使用者的方向递增,如图1 所示: 图1:以 XNA 为基础的 3D 游戏采用的右手坐标系统 控制或显示 3D 模型,我们需要用到描述坐标的 Vector2 和 Vector3 结构,以及用来协助坐标计算的 Vector4 结构与 Matrix 结构。有关 Vector2、Vector3、和 Vector4 等和坐标有关的结构型态的详细功能可以参考 [XNA Framework 常用的类别] 一文的说明。 除了描述坐标和进行坐标计算需要用到的结构型态以外,要显示和控制 3D 模型,我们还需要了解 3D 模型的 Object Space (亦称 Model Space)、World Space、View Space、和 Screen Space (亦称 Projection Space) 四种空间表示法的意义。 可以平移 3D 模型的 World Matrix,当您想将 3D 模型平移至 X 坐标为 10,Y 坐标为 0,Z 坐标为 50 的位置,就可以利用以下的程序代码建立 World Matrix: ateTranslation(new Vector3(10, 0, 50)); 做好之后,游戏程序只要将所建立的 World Matrix 套用至 Mesh 的 Effect,就可以达到平移 3D 模型的效果。 如果游戏程序需要旋转 3D 模型,可以呼叫 Matrix 结构的CreateRotationX并传入旋转角度表示要依据 X 轴为轴心旋转指定的角度,呼叫 Matrix 结构的CreateRotationY方法并传入旋转角度表示要依据 Y 轴为轴心旋转指定的角度,或是呼叫 Matrix 结构的CreateRotationZ方法并传入旋转角度表示要依据 Z 轴为轴心旋转指定的角度。请注意CreateRotationX、CreateRotationY、和 CreateRotationZ方法需要的角度的单位是弪度量,游戏程序可以视需要先利用MathHelper类别的ToRadians方法将单位为度度量的角度转换成弪度量,以便执行旋转的动作。 以下的程序代码会建立可以将 3D 模型以 Y 轴为核心旋转 180 度的 Matrix: tationY(MathHelper.Pi); 请注意上述的程序代码会利用MathHelper类别的 Pi 属性指定旋转的角度为 180 度。游戏程序除了可以利用CreateRotationX、CreateRotationY、和CreateRotationZ方法来旋转 3D 模型以外,也可以利用 Matrix 结构提供的CreateFromYawPitchRoll方法指定以 X 轴、Y 轴、和 Z 轴为轴心的旋转角度,其中的 Yaw 代表以 Y 轴为轴心的旋转角度,Pitch 代表以 X 轴为轴心的旋转 Z 轴为轴心的旋转角度,如图2 所示: 角度,而 Roll 代表以 图 2:Pitch 代表以 X 轴为轴心的旋转角度,而 Roll 代表以 Z 轴为轴心的旋转角度 例如以下的程序代码中呼叫 Matrix 结构的CreateRotationX、CreateRotationY、和CreateRotationZ方法的语法: ateScale(2.0f) * ) * Matrix.CreateRotationY(MathHelper.Pi) * ) * 就可以改呼叫 Matrix 结构的CreateFromYawPitchRoll方法来代替,如下: ateScale(2.0f) * lper.Pi, MathHelper.Pi, MathHelper.Pi) * [提示] 游戏程序可以利用 XNA Framework 提供的MathHelper类别的方法完成常用的数学运算,包括计算角度,例如游戏程序需要用到 180 度角,就可以利用MathHelper.Pi来取得,需要 360 度角,可以 直接利用MathHelper.TwoPi来取得,不需要执行MathHelper.Pi * 2,需要 90 度 角的时候则使用 MathHelper.PiOver2 来取得,不需执行MathHelper.Pi / 2,需要 45 度角时可以利用 MathHelper.PiOver4 来取得,不需要执行MathHelper.Pi / 4,以获得最佳的执行效能。 除了可以协助游戏程序取得角度以外,MathHelper类别也可以协助游戏程序执行度度量和弪度量之间的转换,例如MathHelper类别的ToDegree方法可以将弪度量转换成度度量,而MathHelper类别的ToRadians方法可以将度度量转换成弪度量,不需要游戏程序自行执行转换的动作。 3D 模型,可以善用 Matrix 结构提供的 如果游戏程序需要放大/缩小 CreateScale方法,例如以下的程序代码便会建立可以将 3D 模型放大两倍的 Matrix 结构: le(2.0f); 透过上述放大/缩小、旋转、和平移等操作,游戏程序能够将 3D 模型定位在指定的位置和角度。请注意 Matrix 结构进行乘法运算的时候必须按照 SRT (Scale * Rotation * Translation) 顺序来执行,也就是必须先执行放大/缩小的动作,再执行旋转的动作,最后再执行平移的动作,因为 Matrix 结构的乘法不会有累积的效果。 学会将 3D 模型的物体空间 (Object Space) 转换成世界空间 (World Space) 之后,接下来我们就要引入相机的位置,计算出 3D 模型的检视空间 (View Space),也就是从使用者的角度检视 3D 模型的位置。 游戏程序可以呼叫 Matrix 结构提供的CreateLookAt方法,依据包括相机位置在内的相关信息,建立可以将世界空间转换成检视空间的 Matrix 结构。例如以下的程序代码就会利用 Matrix 结构的CreateLookAt方法建立可以将 3D 模型世界空间转换成检视空间的 Matrix 结构: kAt(new Vector3(0, 3, 5), new Vector3(0, 0, 0), 请注意CreateLookAt方法的第一个参数代表相机的位置,第二个参数代表欲检视的物体的位置,而第三个参数则是代表 Up 向量,也就是相机旋转依据的轴心,传入 (0,1,0) 表示相机可以以 Y 轴为轴心旋转 (即图3 中的 UP 轴),传入 (0,0,-1) 表示相机可以以 Z 轴为轴心旋转 (即图3 中的 LOOK 轴),而传入 (1,0,0) 表示相机可以以 X 轴为轴心旋转 (即图3 中的 RIGHT 轴),如图3 所示: [提示] X、Y、Z 三个元素值皆为 0 的 Vector3 结构可以表示成Vector.Zero,而 X、Y、Z 三个元素值分别为 0,1,0 的 Vector3 结构可以表示成Vector.Up,所以上述建立可以将 3D 模型的世界空间转换成检视空间的 Matrix 结构的程序代码可以简写成以下的样子: kAt(new Vector3(0, 3, 5), Vector3.Zero, Vector3.Up); 计算好 3D 模型的检视空间之后,游戏程序还需要将检视空间转换成屏幕空 间,也就是将 3D 模型的检视空间投影到 2D 的平面空间的位置,完成呈现 3D 模型的动作,因此屏幕空间 (Screen Space) 又称为投影空间 (Projection Space)。要完成从检视空间至投影空间的转换,游戏程序可以利用 Matrix 结构提供的CreatePerspectiveFieldOfView方法,建立能够执行转换工作的 Matrix 结构 (即 Projection Matrix)。 例如以下的程序代码就会呼叫 Matrix 结构的CreatePerspectiveFieldOfView方法,建立可以将 3D 模型的检视空间投射到屏幕空称的 Matrix 结构: ounds.Width / (float)Window.ClientBounds.Height; atePerspectiveFieldOfView( Matrix 结构的CreatePerspectiveFieldOfView方法需要的第一个参数是单位为弪度量的视角,其角度 必须介于 0~p (即 0~180 度) 之间,第二个参数是高宽比例,您可以将游戏窗口的寛度除以游戏窗口的高度当做高宽比例,或是直接使用 GraphicsDeviceManager的GraphicsDevice属性的 Viewport 属性的AspectRatio属性的内容值当做高宽比例,第三个参数是与近平面 (Near Plane) 的距离,请注意距离比与近平面还近的内容都不会呈现在游戏窗口中,第四个参数是与远平面 (Far Plane) 的距离,请注意距离比与远平面还远的内容都不会呈现在游戏窗口中。 有关近平面与远平面在 3 度空间的意义可以参考图4: 图4:近平面与远平面在3度空间的意义 [注意] 以 XNA 为基础的游戏程序必须为每一个欲显示的 3D 模型建立 World Matrix,每一次改变相机的位置或方向都必须重新计算 View Matrix,而 Projection Matrix 则只要在游戏程序开始的时候计算一次即可。 3D 模型显示控制 了解 3D 模型的显示与控制原理,以及如何建立将 3D 模型的物体空间转换成世界空间的 Matrix 结构,如何建立将世界空间转换成检视空间的 Matrix 结构,以及如何建立将检视空间投射在屏幕空间的 Matrix 结构之后,接下来我们就要制作可以控制 3D 模型显示的游戏程序。 首先请启动 Visual Studio 2010 Express for Windows Phone,建立 [Windows Phone Game(4.0)] 型态的项目,并将制作好的 3D 模型加入到 Content Pipeline 项目中。有关如何制作 3D 模型可以参考 [3D 游戏设计] 一文的说明。 准备好游戏程序欲显示的 3D 模型之后,请编辑 Game1 类别的建构函式,加入以下的变量宣告,负责管理 3D 模型、3D 模型的显示位置、旋转角度、3D 模型大小、相机位置、以及记载能够将 3D 模型的检视空间投射到屏幕空间的 Matrix 结构: //管理 3D 模型的變數 ; //記錄 3D 模型的顯示位置的變數 //記錄 3D 模型的旋轉角度的變數 記錄 3D 模型大小的變數 // (0.0f, 50.0f, 5000.0f); //記錄相機位置的變數 能夠將 3D 模型的檢視空間投射到螢幕空間的 Matrix 結構 宣告妥必要的变量之后,请将 Game1 类别的建构函式编辑成以下的样子,负责定义 XNA 游戏的窗口大小: ger(this); 800; //設定遊戲視窗的高度為 800 480; //設定遊戲視窗的寬度為 480 ks(333333); 设定好游戏窗口的高度和宽度之后,请编辑 Game1 类别的 Initialize 方法,加入初始化触控面板,以及计算能够将 3D 模型的检视空间投射到屏幕空间的 Matrix 结构的程序代码: 觸控面板,啟用FreeDrag和 Pinch 功能 pectiveFieldOfView(MathHelper.PiOver4, ectRatio, 型的檢視空間投射到螢幕空間的 Matrix 結構, ,與近平面的距離為 //1,與遠平面的距離為 100000 base.Initialize(); } 完成初始化触控面板,以及计算能够将 3D 模型的检视空间投射到屏幕空间的 Matrix 结构之后,请编辑 Game1 类别的LoadContent方法,加入加载 3D 模型资源的程序代码: sDevice); an"); //載入名稱為SnowMan的 3D 模型資源 [注意] 读者必须视需要修改上述程序代码所指定的 3D 模型资源名称,以加载正确的 3D 模型资源。 加载妥游戏程序欲显示的 3D 模型之后,请将 Game1 类别的 Update 方法编辑成以下的样子,负责依据使用者的触控操作改变旋转 3D 模型的角度,以及放大/缩小 3D 模型的比例: egameTime) ).Buttons.Back == ButtonState.Pressed) ) //判斷使用者是否執行了手勢操作 eadGesture(); //讀取使用者的手勢操作 //判斷使用者的手勢操作型態 caseGestureType.FreeDrag: modelRotation += gesture.Delta.X; //依據使用者拖 break; caseGestureType.Pinch: Vector2 a = gesture.Position; Vector2 aOld = gesture.Position – gesture.Delta; //取得第一個觸碰點的起始 Vector2 b = gesture.Position2; Vector2 bOld = gesture.Position2 – gesture.Delta2; //取得第二個觸碰點的起始 float d = Vector2.Distance(a, b); //計算兩個floatdOld = Vector2.Distance(aOld, bOld); //計算兩個floatscaleChange = (d - dOld) * .01f; //modelScale += scaleChange; //將距離變化量的 1/10 當break; } } base.Update(gameTime); } 制作好利用触控操作改变 3D 模型大小以及旋转角度的程序代码之后,接下来我们就可以依据 3D 模型的旋转角度和大小显示 3D 模型。请将 Game1 类别的 Draw 方法编辑成以下的样子: ameTime) rBlue); //依據 3D 模型內含的骨骼數量建立 Matrix 陣列 (transforms); //取出骨骼的轉置矩陣資料 shes) //逐一取出 3D 模型中所有的網格資料 ffects) //逐一設定網格資料的所有 Effect { effect.EnableDefaultLighting(); effect.World = transforms[mesh.ParentBone.Index] * Matrix.CreateScale(modelScale) * ) * Matrix.CreateTranslation(modelPosition); //設定Effect的World effect.View = Matrix.CreateLookAt(cameraPosition, Vector3.Up); //設定 Effect 的 View Space effect.Projection = ProjectionMatrix;//計算 3D 模型投 } mesh.Draw(); // } base.Draw(gameTime); } 做好之后请将游戏程序部署到 Windows Phone 7 智能型手机上执行,读者可以利用单点触控的方式 在游戏窗口拖曳,控制 3D 模型的旋转角度,也可以利用多点触控的方式放大/缩小 3D 模型的大小。 允许用户控制 3D 模型旋转角度和大小的游戏程序的执行画面如图5 所示: 图 5:允许用户控制 3D 模型旋转角度和大小的游戏程序的执行画面 [范例档案下
/
本文档为【3D 游戏控制】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索