游戏开发论坛

 找回密码
 立即注册
搜索
查看: 10432|回复: 16

处理ARPG和RTS中的碰撞技术精萃(原创)

[复制链接]

197

主题

1041

帖子

1104

积分

金牌会员

Rank: 6Rank: 6

积分
1104
QQ
发表于 2006-10-10 23:38:00 | 显示全部楼层 |阅读模式
在2006年10月的国庆期间,我分析了整整4天,终于理清了整个RTS引擎中的碰撞流程,在国庆过后,就是现在,我完成了整个碰撞处理系统,是基于3D游戏引擎实现的RTS模式的collision AI,其中包括:对碰,摩擦碰,角碰,追踪碰,分离碰,静态碰,并行碰,一共7种关系碰撞状态。

因为节前我在gameres和tw发表过一篇关于collision AI相关的文章,那时只是从一个分析角度,确定碰撞流程的开发方向,其中缺乏诸多技术细节。因为这点,当时许多人都在批评我,并且我也承诺在往后几天会给出详细的碰撞技术资料。现在刚刚做完碰撞,下一步是规则系统,因为今天处于缓冲期,所以我把原创的思想+制作技巧整理了一下。目前国内的游戏制作水平还很落后,我们走在前面的老革命,理当尽一些绵薄之力。

要制作出RTS模式的AI碰撞系统,首先你需要的是一个DirectionScan函数,该函数的作用在于分析两个物体的方位坐标关系。因为现在3D游戏引擎中的对象往往大小不一,加上物理坐标系统又全是用的精度浮点,所以在方位坐标分析上,应该按从BoundBox取出的4轴进行判定。可能这一段你会感到不好理解,我画了一幅方位分析的草图。DirectionScan这一步的主要任务,是得到一个方位坐标,打个比方,我有两个物体,分别是obj1和obj2,DirectionScan函数是基于物理坐标系统分析出obj2位于obj1的什么方向。而我提到的BoundBox的4轴判定,是指DirectionScan的坐标分析方法。最后得到的结果是,obj2位于obj1的方向,其中包括:上,右上,右,右下,下,左下,左,左上,原地,一共9个方位。

因为DirectionScan的实现很麻烦,而从直观上理解,它的前后逻辑分析并不麻烦,一般只要做过几年游戏,一眼就能明白,所以我就不在这点上浪费唇舌了,去看图。

在分析出了方位以后,我们可以用辩证法来假设一些实际情况。为了更好表达,我又画了一幅图,请参看A1模式以后再来阅读下文。

值得一提的是,本文只介绍3D Collision AI,并没有涉及到3D Collision Detected,因为关于Detected的技术资料目前太多太多,有点3D游戏制作基础的地球人都会,所以在碰撞Detected的技术上我就不予以讲解了,因为写Detected纯粹是浪费时间。

刚才提到的A1模式,如果你把页面往下拉,就会看到我画的模式图解,都是中文在说明。而在说明中,我提到了关系表,其实用数组表这是出于开发经验的缘故,如果用程序来判定碰撞模式,9种坐标方位值,加上obj1的9种运动方位,再加上obj2的运动方位,这里就有729种碰撞模式,如果用代码实现这729种碰撞的分析,那是何其复杂,所以我将之做成了一张3维数组表,并且做了一个针对这729种碰撞模式专用的分析工具,可以直接生成源码,如果你感兴趣可以下载。不过我建议在仔细阅读完这篇全文后再来使用它。

碰撞分析部分到这里就查不多都说完了。接下来的是实现Collision AI,这时候你应该挽挽袖口,准备大干一场,因为实现Collision AI并不容易,少则一周,多则一月。如果你在一周之内就可以搞定Collision AI的算法,那说你的IQ非常之高,我对你表示佩服。因为Collision AI的实现,我花了整整一周,才做到了完善的地步。

在实现Collision AI的时候,有个很重要的技巧,我不得不提一下。前面我讲到各种碰撞,比如对碰,分离碰,并行碰,追踪碰等等,因为我实现Collision AI时,发现这许多的碰撞,其实在处理上只有3种情况。

第一种情况:两个3D物体发生碰撞,其中一个物体会处于等待状态,而另一个是从边上绕过,当处于等待的物体没有和从边上绕过的物体发生碰撞时,等待状态才被取消。这种情况,只会发生在对碰和静态碰的时候。

第二种情况:两个3D物体发生碰撞,其中一个物体处于等待状态,而另一个物体则是保持运动路线,一直到运动的物体没有和等待的物体发生碰撞时,等待状态才被取消。这种情况只会发生在角碰和追踪碰的时候。

第三种情况:两个3D物体发生碰撞,两个物体都不理会,仍然按预定的路线继续运动。这种情况只会发生在并行碰,分离碰,摩擦碰的时候。

根据以上条件,我们在Collision AI的时候其实可以更简单,因为RTS和ARPG的Collision AI无非是要做到尽量不发生拥堵、碰死的情况,那些逻辑上的碰撞模式,比如对碰,并行碰,分离碰,等等都可以被取消掉,直接在关系碰撞表中指定以上三种情况。比如下图的A1碰撞模式,AI碰撞模式是属于第二种碰撞情况。

虽然Collision AI的关系数组表可以被涉及得更简单,但是在思维方式上,我不建议你把关系碰撞表理解成只是得到最终碰撞的分析方式,因为这样干了以后,你会丧失那种对Collision AI特有的感觉,你会在调试时,遇上重重BUG。那种感觉,其实就是对7种碰撞模式的感觉:对碰,摩擦碰,角碰,追踪碰,分离碰,静态碰,并行碰,一共7种。这7种碰撞模式,一定要让它牢牢固定在Collision AI的理念中,否则你以后在做游戏引擎的Collision AI系统时,会遇上很多难以DE掉的BUG。

我在论坛给出的附件,分别是,已经由我做好的一张包括729种碰撞模式的3维数组表,以及一个这张三维数组表的编辑工具。因为我目前做的是游戏引擎,Collision AI又和内核息息相关,其中涉及到运动系统,碰撞检测系统,很多很多东西,缺少一样我的Collision AI代码都不能正常工作,所以我现在还不能给出Collision AI的全部代码,我只能把国庆期间,用了我4天时间做出的那张碰撞表给出来,并且给出那个代码生成工具的代码。

如果你需要制作Collision AI,或则你对现有引擎的Collision AI不满意,打算重写,那么我们多少都算是战友了。

如果你没做Collision AI,但你认真看完了该贴,那么我要算你的老师了。作为你的老师,我希望你记住我,中国游戏界的游戏引擎专家,至少在Collision AI上要算专家。抱歉,我说得很难听,我只希望你以后在大街上碰见我,或则在论坛上碰见我,或则看到我在某地发布我的游戏,你能够给我捧捧场,象征性的表示一下崇拜就行了。我喜欢被人崇拜,我喜欢荣誉感。我从小到大都习惯了,阿门。

另。我的近几年的大作会开源,会公布全部代码,和很多很多游戏资源。不管是企业还是个人业余学习,相信都不会错过的。那是媲美当今业界大作的作品。注意!我会将之开源,甩进SF.net,然后开个个人主义的网站,来给自己搞宣传。趁此期间,我还会另行开发一部比较有艺术价值,但是又不考虑商业价值的游戏,完全是个人爱好。我是游戏制作狂。阿门。

请站长将此文甩进精华区。


sf_20061010233756.jpg

197

主题

1041

帖子

1104

积分

金牌会员

Rank: 6Rank: 6

积分
1104
QQ
 楼主| 发表于 2006-10-10 23:44:00 | 显示全部楼层

Re: 处理ARPG和RTS中的碰撞技术精萃(原创)

碰撞表编辑工具

竟然最大只能500k,站长太小气了吧;)
sf_20061010234344.jpg

197

主题

1041

帖子

1104

积分

金牌会员

Rank: 6Rank: 6

积分
1104
QQ
 楼主| 发表于 2006-10-10 23:59:00 | 显示全部楼层

Re: 处理ARPG和RTS中的碰撞技术精萃(原创)

关系碰撞表的数据,打开内见使用方法

sf_20061010235853.rar

1.15 KB, 下载次数:

197

主题

1041

帖子

1104

积分

金牌会员

Rank: 6Rank: 6

积分
1104
QQ
 楼主| 发表于 2006-10-11 00:03:00 | 显示全部楼层

Re: 处理ARPG和RTS中的碰撞技术精萃(原创)

碰撞关系表代码生成工具的代码

sf_200610110240.rar

28.76 KB, 下载次数:

197

主题

1041

帖子

1104

积分

金牌会员

Rank: 6Rank: 6

积分
1104
QQ
 楼主| 发表于 2006-10-11 00:05:00 | 显示全部楼层

Re: 处理ARPG和RTS中的碰撞技术精萃(原创)

Collision AI的碰撞关系表编辑器的可执行文件

sf_200610110448.rar

258.96 KB, 下载次数:

23

主题

3388

帖子

6440

积分

论坛元老

Rank: 8Rank: 8

积分
6440
发表于 2006-10-13 17:21:00 | 显示全部楼层

Re:处理ARPG和RTS中的碰撞技术精萃(原创)

我是好新好新的新人,想做策划的。
问个小白问题——把所有单位的碰撞体积都按球形处理会不会更简单一些?这样只要根据碰撞双方的速度(速率和方向)、双方质量比、检测到碰撞时双方碰撞体积中心连线的方向就可以计算出碰撞后的效果。

哦,当然还有能量是否损失的问题,一般把碰撞分成:1)完全不损失能量的完全弹性碰撞——碰撞后,双方连心线方向上的分动量发生交换;2)损失大量动能的完全非弹性碰撞——碰后,双方连心线方向上的分速度相等,或干脆2者粘在一起但仍保持之前的总动量(碰撞双方动量的矢量和);3)介于前2种碰撞之间的非完全弹性碰撞,这种碰撞计算起来比较复杂,但可以采取一些近似的方法模拟。

0

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2006-10-14 17:03:00 | 显示全部楼层

这个东西是不是太生硬了

会生出729种情况哈  这个代码 是不是会放到系统级别的 那么许多汽车在一起碰撞的话  那系统还是得做出许多选择  我就拿最简单的汽车游戏来做说明吧  如果你要做一款单机游戏  比较微软那个街头飙车系列的   沿途会有很多撞击  还可以制作很多游戏效果出来  比如撞到一根电线杠  然后那个电线杆就倒了 或者撞飞了 这个都需要表现出来 或者撞到旁边的汽车 檫出火花 或者汽车凹陷下去了 或者翻了  对这些种种要求如果按你说的这种列表形象是远远不够的  有些方位也不需要 而且你的方法只会加来系统的负担 这个时候最好能采用向量的方法
具体方法可以以物体为中心画圆表示  然后按你说的方法可以 给出16坐标系统  每个小段对应1个具体的方位  当1  2  3段会外界发生作用  对汽车以后位子的评估取用1  2  3段中间点到圆心的方式进行再加上相应的数值  用2物体的M V来决定汽车以后的状态  对汽车局部范围的影响就采用1  2  3段都显示汽车受损的情况  对于被碰撞物体 就采用相同的计算方式来决定就行了  我觉得这样更能做到优化算法的目的   一般在情况很复杂的情况下 都不会采用枚举的方式  因为占内存多了  还有我说的方法还有个好处 就是如果汽车撞到特定的哪个位子可以旋转  或者翻跟头  只要是在几个地方同时感应到碰撞的发生 并且代入当时的速度直就行判断就行了 对于在不同方向的撞击还可以代入扭矩  进行计算  这些东西在3D汽车游戏里还是绝对都要考虑到的  
说了 这么多 感觉我是在设计交通事故模拟系统 呵呵  我也是新人  还在读大学哈  
不要见笑 还有我图暂时没画  因为嫌麻烦 我不喜欢画那个东西  要交流的可以给我发电子邮件
f_O_x_man@sohu.com

0

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2006-10-14 17:42:00 | 显示全部楼层

Re:处理ARPG和RTS中的碰撞技术精萃(原创)

我的这种可以说是基于客户端的  最大问题就是外挂安全问题 如果破解了源代码 就能随便改设撞击属性 但是我的方法最大好处 就是不会给系统带来什么负担  而且可以呈现的效果也更多
你说的 方法应该是在服务器上比较实用 但是也会带来很大开销的  象小游戏你的方法就好很多

但是如果要表现的状态比较复杂的话  特别是全方位立体的 就不是很好了 就算方法可行  也不经济
个人意见 仅共个人参考  

197

主题

1041

帖子

1104

积分

金牌会员

Rank: 6Rank: 6

积分
1104
QQ
 楼主| 发表于 2006-10-14 21:40:00 | 显示全部楼层

Re: 处理ARPG和RTS中的碰撞技术精萃(原创)

前几天我传了一个已经做好的碰撞表到论坛

使用方法。方位坐标、运动坐标1,运动坐标2,一共3坐标,作为这张3维array数组的指针。接着可以该表取出3个值,
1,得到碰撞模式,绕开模式,等待模式,忽略模式,一种3种模式
2,发生碰撞的对象1的对应处理状态
3,发生碰撞的对象1的对应处理状态
接着就可以实现整个AI系统了,这张表完全针对实现时使用。相信你在理解上是正确的,但恐怕你还没把我的思想转换成概念。

另,的确有729种状态(9*9*9),但比起写出大量条件判定和枚举更有效,因为是直接查表取得运行时的参考,试问还有比这样更简单有效的方法吗?清仔细参考从array数组表得到的3个值,实现时我将他们简化了很多。

感觉最近做赛车游戏的很多。我所知道的,在gameres已经有n个人了。
赛车种确实存在大量的Collision处理,注意,但更多的我想应该是Detected上吧。

什么叫做Collision AI?形而上是指,在Detected的后一步,而不是Detected本身。如果将CAI误解成Detected,那是大大曲解我的原意。尤其卡特铁角。

因为赛车竞速类和RTS类的差别,赛车游戏和RTS在collision ai上是差别很大的。RTS的处理模式的主要性质是分散、避免堵死、和以最忧化。赛车游戏的collision ai的主要性质是以物理特效为主,比如,车挡速度,碰撞反映。因为我只玩过极品飞车,而且是很多年前,据我记忆,赛车游戏的cai,主要是发生碰撞时对速度的影响,包括摩擦碰。一般发生赛车停住的情况,都是在正面有东西阻挡的时候,而赛车开翻,是依靠速度+碰撞最后模拟出来的。

197

主题

1041

帖子

1104

积分

金牌会员

Rank: 6Rank: 6

积分
1104
QQ
 楼主| 发表于 2006-10-14 21:54:00 | 显示全部楼层

Re:处理ARPG和RTS中的碰撞技术精萃(原创)

我漏了一点。你们对detected,在接近的几何体上,看来你们都很喜欢用Ellipsoid,你们说的圆,我没理解错的话,应该是Ellipsoid吧?

关于检测时用的Ellipsoid,其实是按3个系数计算出来的,Height,width,depth。其实在检测上,无论什么接近几何体来代替,都是可行的。哪怕是,用box和Ellipsoid进行碰撞检测,这些都是可行的。因为我们做碰撞检测的目的是为了下一步,最终的方位都是要计算的,最后的碰撞处理都是要做的,所以我建议不要把精力集中在detected上去,因为detected部分已经由很多国外的大师把代码都写好了,而且非常的完善,所以你们只需要用就可以了。要做游戏的话,注意力放在碰撞处理上。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-28 12:28

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表