3D游戏开发步步高系列课程(4):碰撞检

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

3D游戏开发步步高系列课程(4)碰撞检测和处理付仲恺微软特邀开发专家我们将涉及到…•学习3D游戏‘PucthePirate’的开发议题•网格系统及运动–坐标系映射–网格坐标系–基于结点的运动•碰撞检测–应用球体碰撞检测基础知识•基本计算机知识•基本软件开发(C#)知识Level200Level200议题•网格系统及运动–坐标系映射–网格坐标系–基于结点的运动•碰撞检测–应用球体碰撞检测网格坐标系系统•在基于网格的游戏中,所有的物体都是使用预先定义的距离来放置–适用于平面地图游戏的坐标描述•如:战棋类,简单的即时战略类游戏–例如:cookie的放置•所有的cookie都在水平和竖直方向上对齐•Cookie前后之间距离相等•使用网格地图坐标系系统来描述网格坐标系系统•网格坐标系系统是局部坐标系系统–为了便于描述游戏逻辑和物体的位置•例如,在战棋类游戏中所有物体都位于2维空间中–不能够被DirectX直接使用–在使用时需要先转换为世界坐标系坐标系系统映射•网格坐标系系统与我们的世界坐标系系统不同,但是相互之间具有映射关系–网格坐标系是2维的,而世界坐标系是3维的–两个坐标系的原点和坐标轴都不同•当物体位于结点坐标系系统的(2,3)坐标时,这个物体在世界坐标系中并不位于(2,3,0)坐标•从网格坐标系系统到世界坐标系系统需要经过映射–A=F(B),F是将点从坐标系系统B映射到坐标系系统A的函数–1-1的映射关系坐标系系统映射•Cookie构造函数–base(newVector3(-70.0f+X*15,-60.0f+Y*15,-3.0f)•X轴上的位置:–Position.X等于-70.0f+X*15–X是网格坐标系的X轴数值,Position.X是物体在世界坐标系中X轴上的数值•Y轴上的位置–Position.Y值等于-60.0f+Y*15–Y是网格坐标系的Y轴数值,Position.Y是物体在世界坐标系中Y轴上的数值•Z轴上的位置–物体在Z轴上始终等于-3.0f•物体在X轴和Y轴方向上以15个单位为一个坐标点坐标系系统映射结点系统PucThePirate•红色球体表示结点•红色的粗线连接结点结点系统PucThePirate•所有的对象(除了网格和cookie)都放置在结点上•在创建大部分游戏物体之前必须知道所在的结点位置•为了能够在网格上运动,物体需要使用这些结点•物体的运动就是从一个结点移动到另一个结点•当Puc直接向墙运动时,它停止运动•Puc不能跳过墙•实际情况是,Puc到达一个结点,并且不能够找到新的结点继续运动结点系统PucThePirate•当我们创建结点时,需要传递4个布尔值:•publicNode(…boolUP,boolRIGHT,boolDOWN,boolLEFT)•如果设置为true,“AutoAssignNeighbors”函数将在指定的方向上寻找昀近的结点,并且将其与当前结点相连接基于结点的运动•控制Puc运动的变量•privateNodeSource=null;•privateNodeDestination=null;•privateVector3CurrentMove;•MOVEDIRECTIONCurrentDirection,NextPossibleDirection;•floatSpeed=0.5f;基于结点的运动•导入变量–Source•Puc已经达到的结点(或者层级的起始位置)–Destination•Puc正要前进的结点(当Puc没有运动时,Destination和Source相同)–CurrentMove•Puc正在使用的从Source结点运动到Destination结点的当前向量基于结点的运动•导入向量–CurrentDirection•枚举成员MOVEDIRECTION{UP,DOWN,LEFT,RIGHT,STILL}保存Puc的当前方向。如果Puc当前没有运动,这个变量的值为STILL–NextPossibleDirection•这是Puc将要尝试运动的方向。这个变量直接受到玩家输入的影响基于结点的运动•用户输入的立即结果switch(e.KeyCode){caseKeys.Up:NextPossibleDirection=MOVEDIRECTION.UP;break;caseKeys.Down:NextPossibleDirection=MOVEDIRECTION.DOWN;break;caseKeys.Left:NextPossibleDirection=MOVEDIRECTION.LEFT;break;caseKeys.Right:NextPossibleDirection=MOVEDIRECTION.RIGHT;break;}基于结点的运动•NextPossibleDirection表示玩家希望运动的方向•不是具体的方向,而是表示与当前方向的关系•相同方向•相反方向•不同方向基于结点的运动•情况1(相同方向)•玩家输入的方向与Puc的当前方向相同。在这种情况下,不需要做任何事情基于结点的运动•情况2(相反方向)•只有在这种情况下,不需要等到Puc到达下一个结点,就能够马上转变方向基于结点的运动•情况3(不同方向)•玩家输入的方向与当前的方向不相关。在达到下一个结点(Destination结点)前不进行处理基于结点的运动•在Update中调用HandleMovement函数–检查玩家是否运动到结点上(与结点发生碰撞)•如果是的话,检查玩家是否能够在新的方向上移动–否则,我们检查玩家是否能够在原有方向上继续运动–使用2D碰撞替代球体碰撞»所有结点均在同一个平面中»便于Puc在结点上跳跃时处理,Puc不能跳跃过墙基于结点的运动•为什么需要2D碰撞基于结点的运动•判断Puc当前的位置是否在destination结点的前面,但下一刻的位置却在destination结点的后面–如果是的话,将Puc放置在Destination结点上基于结点的运动•从HandleMovement中调用WantToMove函数•检查玩家是否能够在指定的方向上运动•根据当前结点与该结点的邻居结点返回bool值基于结点的运动•Puc到达了一个结点•绿色的箭头表示玩家尝试运动的方向•如果该方向可接受的话,选择新的运动方向基于结点的运动•Puc到达了一个结点•首选的方向不可接受•当前方向也不可接受,因此玩家停止运动添加结点和Puc运动代码议题•网格系统及运动–坐标系映射–网格坐标系–基于结点的运动•碰撞检测–碰撞检测的类型–应用球体碰撞检测碰撞检测•需要知道物体碰撞发生的时间,以便于触发特定的函数•碰撞算法有很多种类型,根据需要选择不同的模型•真实的物理模拟系统中,需要非常精确的碰撞检测算法•在“PucThePirate”中,我们只需要较为简单的碰撞检测,因为我们只需要知道两个物体什么时候发生碰撞,而不需要知道哪个多边形面发生了碰撞物体碰撞检测类型•包装盒算法•使用多边形(包装盒)包裹住3D物体整体或者主要部分,根据包装盒的距离、位置等信息计算是否发生碰撞•通常使用长方体和球体–计算简单,速度快•BSP树•将场景中相互距离较远的物体剔除出碰撞检测的遍历过程,以提高检测效率物体碰撞检测类型•单步碰撞检测–当时间步较大时会发生两个物体完全穿透而算法却未检测出来的问题•解决方案是产生一个四维空间,在物体运动的开始和结束时间步之间产生一个4D超多面体,用于穿透测试•空间投影–将不规则物体投影成较规则的物体进行碰撞检测–采用缩放的方法,将一个物体缩小而另一个物体相应地放大,加速碰撞检测PucThePirate中的碰撞检测•在“PucThePirate”中,碰撞检测算法用于决定Puc什么时候与敌人,cookie或者炸弹发生碰撞•本游戏引擎使用球体碰撞系统–将所有的物体都抽象为球体,检测球体与球体之间的碰撞•这个碰撞模型要求每个物体都必须有一个中心点和半径•3D碰撞中昀简单的模型球体碰撞检测•球体碰撞如何工作?•我们计算两个物体中心之间的距离,并且将其与两个球体的半径和进行比较•如果距离大于半径和,则没有发生碰撞•否则,如果距离小于半径和,则发生了物体碰撞球体碰撞检测•两个物体中心的距离大于两个球体的半径和球体碰撞检测•两个物体中心的距离小于两个球体的半径和球体碰撞检测•优势–非常适用于这类游戏,不需要精确地碰撞检测算法–执行速度相对较快,因此不会给CPU带来过大的计算负担•劣势–只适用于近似球形物体,如果物体非常窄或者非常宽,该碰撞检测算法将会失效•会在物体实际发生碰撞之前,碰撞检测系统就发出碰撞信号球体碰撞检测•球体碰撞–坏情况–当物体形状与球形相差较远的时候,该算法会产生较大的误差球体碰撞检测•这个问题的解决方法:–对于扁长物体,减少碰撞球体的半径–或者使用其它碰撞检测算法添加碰撞检测代码课程总结•网格系统及运动–坐标系映射–网格坐标系–基于结点的运动•碰撞检测–应用球体碰撞检测获取更多MSDN资源•MSDN中文网站•MSDN中文网络广播•MSDNFlash•MSDN开发中心―培训内容包含昀新WindowsVista、WindowsLonghorn、.Net2.0应用开发、数据库技术、智能设备、Office12开发培训―培训讲师微软资深讲师,项目经理、以及国内外技术领域专家等―培训形式为期2-4天,小班授课(20-40人,每人一机),案例教学为主,配合上机试验―培训对象企业软件架构师,软件开发人员和测试人员―培训成果自2005年10月起,全国已经举办超过20余场,培训高级技术人才500余人,取得了企业良好的口碑和学员的高度信任。Workshop―Workshop简介Workshop是微软潜力发展计划的主要内容之一,是微软面向软件企业的深度专业软件技术、技能培训。微软新技术培训——Workshop•四月份培训计划–上海VisualStudio2005(3天)4月13日—4月15日–北京VisualStudio2005(3天)4月21日—4月23日–苏州VisualStudio2005(2天)4月20日—4月21日–南京VisualStudio2005(2天)4月27日—4月28日–深圳WindowsVista(2天)5月11日—5月12日精彩workshop,期待您的加入更多内容请参阅如需提出问题,请单击“提问”按钮并在随后显示的浮动面板中输入问题内容。一旦完成问题输入后,请单击“提问”按钮。

1 / 46
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功