VIP专享文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特权免费下载VIP专享文档。只要带有以下“VIP專享文档”标识的文档便是该类文档
VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档
VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档
付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档
共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。
首先假设你对与碰撞检测相关的幾何和数学知识已经有了基本的了解在文章的最后,我将提供一些这方面的参考资料以免你对它们感觉有点生疏。另外我还假设你已經读过 Jeff Lander 的图形专栏里关于碰撞检测文章(“Crashing into the New Year,” ; “When Two Hearts Collide,”;和 “Collision Response: Bouncy, Trouncy, Fun,”)我将首先进行一个大概的描述,然后快速地切入到核心内容里通过这两步從上至下地深入到碰撞检测中。我将讨论两种类型的图形引擎中的碰撞检测:基于 portal 的和基于 BSP 的每种引擎中多边形的组织各不相同,因此茬 world-object 型的碰撞检测上存在很大的差别而object-object 型的碰撞检测绝大多数地方在上述两种引擎里的是一样的,主要看你是如何实现的了当我们接触箌多边形的碰撞检测时,我们还会实验如何将其扩展到我们学过的凸型物体上
为了创建一个理想的碰撞检测程序,我们不得不在开發一个游戏的的图形管道的同时就开始计划并创建它的框架在项目的最后加入碰撞检测是相当困难的。想在开发周期的末尾创建快速的碰撞检测将很有可能会使整个游戏被毁掉因为我们不可能使它能高效地运行。在好的游戏引擎中碰撞检测应该是精确、有效并且十分赽速的。这些要求意味着碰撞检测将要与场景的多边形管理管道紧紧地联系起来这也意味着穷举法将无法工作??今天的3D游戏中每帧处理的數据量很可能导致打格,当你还在检测一个物体的各多边形是否与场景中的其它多边形碰撞时时间已经过去了。
让我们从基本的游戲引擎循环开始吧(列表1)快速浏览这些代码来得到碰撞检测的相关策略。我们先假设碰撞没有发生然后更新物体的位置,如果发现發生了碰撞我们将把物体移回原来的位置不允许它穿越边界(或将物体销毁或执行一些预防措施)。然而这个假设太过简单因为我们無法得知物体原来的位置是否仍然有效。你必须为这种情况设计一个方案(否则你可能会体验到坠机或被子弹击中的感觉??就是前面举的例孓)如果你是一个热心的玩家,你可能已经注意到了在一些游戏当中当你挨着墙壁并试图穿过去的时候,摄像机就开始震动你正经曆的就是将主角移回原位的情况。震动是因为取了较大的时间片引起的
但是我们的方法有缺陷,我们忘了在等式中加入时间图1告訴我们时间太重要了不能忘了它。即便物体在 t1 或 t2 时刻没有发生碰撞它仍有可能在 t 时刻穿过边界(t1
我们可以把时间看成是第四维并将所有运算在4维空间中进行。然而这可能会让运算变得十分复杂所以我们会避开这些。我们还可以创建一个以 t1、t2时刻的物体为起始点的实惢体然后用它来与墙进行测试(见图2)Figure 2. Solid created from the space that an object spans over a given time frame.
一个简单的方法就是创建一个凸壳来罩住两个不同时刻的物体。这种方法效率低下可能会明顯地降低你的游戏速度以其创建一个凸壳,还不如创建一个围绕实心体的包围盒我们学习其它的技术后再回来讨论这个问题。
有叧一种比较容易执行但精度较低的方法就是把给定的时间段分为两分,然后测试时间中点的相交关系我们还可以递归地依次测定各段嘚时间中点。这个方法比先前的方法要快得多但不能保证能捕捉到所有的碰撞情况。
另一个暗藏着的问题是collide_with_other_objects()方法的实现??即判断一个粅体是否与场景中的其它物体相交如果场景中有很多的物体,这个方法可能消耗很大如果要判断各物体与场景中其它物体是否相交,峩们将不得不进行大概N选2次比较因此比较次数会是N的平方次?(或表示成O(N2))。但我们可以用几种方法来避免进行O(N2)对的比较举个例子,我們可以把场景中的物体分成静态的(被撞物)和动态的(碰撞物??即使它的速度为0也行)就好象房间中的墙壁是被撞物,而一个扔向墙壁嘚小球是碰撞物我们可以创建两棵独立的树(每一棵对应一类物体),然后测试那些物体可能会碰撞的树我们甚至可以对环境进行约萣让一些碰撞物之间不发生碰撞??比如我们不需要在两颗子弹之间进行判断。现在在继续之前(经过改进之后)我们可以说处理过程变得哽加清晰了。(另一个减少场景中成对的比较的方法就是建立八叉树这已经超出了这篇文章的范围,你可以在Spatial
基于 Portal 的引擎把场景或卋界分割成较小的凸方形区域凸方形区域很适合图形管道因为它们能避免重绘现象。不幸的是对碰撞检测来说,凸方形区域会给我们帶来一些困难在我最近的一些测试中,一个引擎中平均大约有400到500个凸方形区域当然,这个数字会随着不同的引擎而有所变化因为不哃的引擎使用不同的多边形技术。而且多边形的数目也会因场景的大小而有所不同
判断一个物体的多边形是否穿过了场景中的多边形产生的运算量可能会很大。一个最简单的碰撞检测法就是用球形来近似地表示物体或物体的一部分然后再判断这些包围球是否相交。這样我们仅仅需要测试两个球体中心的距离是否小于它们的半径合(这表示发生了碰撞)如果我们是用中心点距离的平方和半径合的平方进行比较,那更好这样我们可以在计算距离时除去拙劣的开方运算。但是简单的运算也导致了精确度的降低(见图3)。
但我们僅仅是将这个不太精确的方法做为我们的第一步我们用一个大的球体代表整个对象,然后检测它是否和其它的球体相交如果检测到发苼了碰撞,那么我们就要进一步提高精度我们可以将大的球体分割成一系列小的球体,并检查与各小球体是否发生碰撞我们不断地分割检查直到得到满意的近似值为止。分层并分割的基本思想就是我们要尽可能达到适合需要的理想的情况
用球体去近似地代表物体運算量很小,但在游戏中的大多数物体是方的我们应该用方盒来代表物体。开发者一直用包围盒和这种递归的快速方法来加速光线追踪算法?谑导手校
第二章 GPS定位相关基本知识 围绕卫煋、地面测站的位置信息需要设定参考的空间和时间系统以及对卫星轨道精确计算坐标系统与时间系统是描述卫星运动,处理观测数据囷表达定位结果的数学与物理基础因此,了解和掌握一些常用坐标系统和时间系统熟悉它们各自间的转换关系,对GPS用户来说是极为偅要的。 地球的形状和大小 基本概念 1. 重力方向线 即铅垂线, 是测量工作的基准线 2. 水准面 自由静止的水面; 是等位面, 有无数个 §2-1 空间参考坐标系統介绍 空间系统即空间参考坐标系需要确定原点、坐标轴指向、长度单位。 GPS测量与应用中常采用直角坐标系统及其相应的大地坐标系,取地球的质心作为原点根据坐标轴取向不同: 一类是地球坐标系,该系坐标系是固结在地球上的随地球一起转动,故又称为地固坐標系它是一种非惯性坐标系,对于表述点的位置和处理GPS观测结果是十分方便的地固坐标系有多种表达形式,对GPS测量来说最基本的是鉯地球质心为原点的地心坐标系。 第二类是天球坐标系该类坐标系与地球自转无关,称空固坐标系对于描述卫星的运行状态、确定卫煋轨道是极其方便的。 坐标系 相互转换 Coordinate