Silverlight.XNA(C#)跨平台3D游戏研发手记:(十)3D 场景与控制设计①.doc_第1页
Silverlight.XNA(C#)跨平台3D游戏研发手记:(十)3D 场景与控制设计①.doc_第2页
Silverlight.XNA(C#)跨平台3D游戏研发手记:(十)3D 场景与控制设计①.doc_第3页
Silverlight.XNA(C#)跨平台3D游戏研发手记:(十)3D 场景与控制设计①.doc_第4页
Silverlight.XNA(C#)跨平台3D游戏研发手记:(十)3D 场景与控制设计①.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、模型和骨骼动画仅仅是开启3D游戏的敲门砖,置入基于摄像机的场景设计方能呈现最完美的3D游戏。本节,我们依旧从简单着手,一步步创建基于模型的3D游戏场景。XNA4.0学习指南(中文)是一本绝对值得一看的好书,对于3D游戏的基础知识、概念以及简单应用讲解非常全面。比如书中提到关于XNA内置了创建摄像机的方案代码,根据该提示我们便可轻松实现一个名为Camera3D的类:3D摄像机 /3D摄像机/publicsealedclassCamera3D:Object3DpublicMatrixViewget;set;publicMatrixProjectionget;set;publicVector3Tar

2、getget;set;publicVector3Upget;set;publicfloatNearget;set;publicfloatFarget;set; /获取或设置视角模式/publicViewModesViewModeget;set;publicCamera3D(ContentManagercontent,GraphicsDevicedevice,Vector3position,Vector3target,Vector3up,floatnear,floatfar):base(content,device)this.Position=posi

3、tion;this.Target=target;this.Up=up;this.Near=near;this.Far=far;/更新以3D角色为中心的视口/publicvoidUpdateViewPort(Role3Drole3D)if(role3D!=null)Vector3center=role3D.Position;switch(ViewMode)caseViewModes.FirstPerson:SetViewPort(center,-5,-10,role3D.Eye-10,role3D.Eye-10);break;caseViewModes.ThirdPersonHeadlook:S

4、etViewPort(center,30,-410,role3D.Eye,role3D.Eye-130);break;caseViewModes.ThirdPersonOverlook:SetViewPort(center,role3D.Eye+80,0,role3D.Eye+100,0);break; /从(0,y1,a)向(0,y2,b)方向看,其中a,b调节远近,y1,y2调节高度,Scale伸缩摄像机/参照物中心位置/Position的Z位置/Target的Z位置/Position的Y位置/Target的Y位置voidSetViewPort(Vec

5、tor3center,floata,floatb,floaty1,floaty2)a*=Scale;b*=Scale;floatx1=(float)(a*Math.Sin(RotationY);floatz1=(float)(a*Math.Cos(RotationY);floatx2=(float)(b*Math.Sin(RotationY);floatz2=(float)(b*Math.Cos(RotationY);Position=center+newVector3(x1,y1,z1);Target=center+newVector3(x2,y2,z2);/更新摄像机的视图矩阵和投影矩阵/

6、publicoverridevoidUpdate(GameTimerEventArgse)View=Matrix.CreateLookAt(Position,Target,Up);Projection=Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4,device.Viewport.AspectRatio,Near,Far);摄像机是我们观查3D世界的窗口,很多游戏开发者会亲切的称之为“上帝之眼”。毫不夸张的说,有了它,市面上一切3D游戏视觉设定都能随意实现。比如“第一人称视角”的RPG和FPS,经典代表作有魔法门,反恐精英等:第一人

7、称视角的最大特点是玩家置入感强,屏幕就好比玩家的眼睛,玩家通过屏幕看去仿佛置身其中,身临其境般感觉,非常真实。当然,在此基础上又进化出来了“第三人称平视”视角,该视角很好的规避了“第一人称视角”中存在的视觉死角以及容易产生眩晕等问题,动作感及玩家操控体验更强,逐渐成为3D游戏,尤其是动作和射击类3D游戏的主流视角。经典代表作有ACT鬼泣和TPS全球使命等:而“第三人称俯视”视角则是我们最最常见的游戏视角,该视角非常有利于玩家时刻观察大范围周边环境,视觉面广,立体感强,操作尤为爽快。应该感谢网游,使之能够成为目前绝大多数玩家最钟爱的3D(2.5D)游戏视角模式。经典游戏耳熟能详,举不胜举,比如A

8、RPG暗黑破坏神和SLG英雄无敌:总体来说,游戏视角的选取应该符合游戏本身的性质以及匹配游戏的核心玩法,像刺客信条等神作,为了在不同动作、环境时得到最好的玩家操控体验,采用了极为复杂的动态视角切换技术。当然还有比如上古卷轴5和辐射3等大作,为了不失去任何玩家,系统可根据玩家自身适应性与操作习惯选择相应的特定视角等等。通过对以上案例的分析,目的只想向大家传递一个思想:开发3D游戏若能很好的把握住摄像机的运作原理,对于3D游戏场景设计来说,一切都是小Case。接下来,为了让大家更进一步理解3D摄像机,以上一节中的骨骼动画角色作为主角,以3DMAX导出的FBX格式建筑模型模拟游戏实际场景,再根据之前

9、创建的摄像机代码,通过修改其中的Position和Target两个关键参数即可调节出任意3D视角:当我们将摄像机置于主角的眼睛位置(很多射击类游戏会将摄像机置于角色胸口处,这样角色的双手及手中的武器都能清晰可见),并同时看向主角的正前方时,此时便形成了“第一人称视角”(通常我们会在屏幕正中心放置一个十字准心,用于方向与目标的定位):当摄像机置于主角身边某处(比如正后方)并穿过主角看向前方,同时仅作围绕主角的垂直方向旋转时,便形成了“第三人称平视”视角:将摄像机固定于主角的上空,并呈一定角度的倾斜对准主角脚底俯视时,便形成了“第三人称俯视”视角:其实很简单对吧,不妨将摄像机看作是我们的游戏屏幕,

10、那么各类视角的实现其实都不过如此。最后,为了配合Windows Phone等移动设备独特的操作方式,按照游戏玩家们的传统习惯,即左手控制角色移动,右手控制行为指令;那么我们便可创建出一个名为Controller的“虚拟拇指摇杆控制器”类,并分别置于屏幕左右两边:虚拟拇指摇杆 /基于虚拟拇指摇杆的控制器/publicsealedclassController:Object2DTexture2Drtexture,ltexture,backStick;constintmaxThumbstickDistance=50;constintdistanceThumbsticks=50;Vector2righ

11、tCornerPosition,leftCornerPosition;Vector2rightBackStick,leftBackStick;Vector2rightPosition,leftPosition;Vector2rightThumbstickCenter,leftThumbstickCenter;publicController(ContentManagercontent,Vector2size):base(content)backStick=content.Load(Image/BackgroundStick);rtexture=content.Load(Image/RStick

12、);ltexture=content.Load(Image/LStick);Vector2middleTexture=newVector2(rtexture.Width/2,rtexture.Height/2);rightThumbstickCenter=newVector2(size.X-distanceThumbsticks-middleTexture.X,size.Y-distanceThumbsticks-middleTexture.Y);leftThumbstickCenter=newVector2(distanceThumbsticks+middleTexture.X,size.Y

13、-distanceThumbsticks-middleTexture.Y);rightCornerPosition=rightThumbstickCenter-middleTexture;leftCornerPosition=leftThumbstickCenter-middleTexture;rightBackStick=rightCornerPosition-newVector2(distanceThumbsticks,distanceThumbsticks);leftBackStick=leftCornerPosition-newVector2(distanceThumbsticks,d

14、istanceThumbsticks);/获取或设置操作模式(精确度)/publicControlModesControlModeget;set;/获取或设置左侧虚拟拇指摇杆位置/publicVector2LeftThumbstickget/缩放向量计算触摸位置的中心,缩放最大摇杆距离Vector2l=(leftPosition-leftThumbstickCenter)/maxThumbstickDistance;/如果长度大于1,转化为单位矢量if(l.LengthSquared()1f)l.Normalize();returnl;/获取或设置右侧虚拟拇指摇杆位置/publicVector

15、2RightThumbstickgetVector2l=(rightPosition-rightThumbstickCenter)/maxThumbstickDistance;if(l.LengthSquared()1f)l.Normalize();returnl;publicoverridevoidUpdate(GameTimerEventArgse)TouchLocation?leftTouch=null,rightTouch=null;TouchCollectiontouches=TouchPanel.GetState();foreach(TouchLocationtouchintouc

16、hes)switch(ControlMode)caseControlModes.Accurate:if(Math.Pow(touch.Position.X-leftThumbstickCenter.X),2)+Math.Pow(touch.Position.Y-leftThumbstickCenter.Y),2)=Math.Pow(backStick.Width/2,2)leftTouch=touch;leftPosition=touch.Position;continue;if(Math.Pow(touch.Position.X-rightThumbstickCenter.X),2)+Mat

17、h.Pow(touch.Position.Y-rightThumbstickCenter.Y),2)=Math.Pow(backStick.Width/2,2)rightTouch=touch;rightPosition=touch.Position;continue;break;caseControlModes.Rough:if(touch.Position.X=TouchPanel.DisplayHeight/3)leftTouch=touch;leftPosition=touch.Position;continue;if(touch.Position.XTouchPanel.Displa

18、yWidth/2&touch.Position.Y=TouchPanel.DisplayHeight/3)rightTouch=touch;rightPosition=touch.Position;continue;break;if(leftTouch.HasValue&rightTouch.HasValue)break;if(!leftTouch.HasValue)leftPosition=leftThumbstickCenter;if(!rightTouch.HasValue)rightPosition=rightThumbstickCenter;publicoverridevoidDraw(GameTimerEventArgse,SpriteBatchspriteBatch)if(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论