找回密码
 点一下
查看: 9217|回复: 32

War3与SC2的单位碰撞形状区别,以及War3 Mod的“十字围杀

[复制链接]
发表于 2015-1-4 10:32:58 | 显示全部楼层 |阅读模式
本贴原作为回帖发表于这个帖子里的回复里:
http://bbs.islga.org/read-htm-tid-2219371-page-1-fpage-1.html


但由于内容比较多,而且是科普性质的,所以在dada同学的建议下单独分割出了这个帖子:


关于单位碰撞和War3 Mod十字围杀


War3的十字围杀之所以能成立是因为war3的碰撞是由一个个小方形近似出来的。而且长度必须是小方形的倍数。


1.jpg


2.jpg

图片比例有所夸张,但十字围杀本质上就是这么回事儿。

未标题-2.jpg

但sc2则是完全自由的圆形,因此空隙就大一些。而且没有最小单位的说法,圆的大小相当自由。但是相对的,东西,西南,东南,东北四个方向就容易被找出空隙而逃出去。

333333333.jpg

但是要注意的是,war3并不是刻意做成方形的,而是当时的3d游戏技术不够,才勉强那样子模拟。实际上war3本来就是希望做成圆形碰撞的。实际上在编辑器里war3单位的碰撞表示还是圆形,但实际进了就游戏以后就无法动态地实现圆形碰撞,只能以方形来模拟。

实际上很有趣的一点是,虽然在编辑器里单位有着各种各样的碰撞数据,但实际上实际游戏里只有2-3种。比如农民的碰撞是16数据,步兵的碰撞是31数据,你显然会认为农民的碰撞比步兵小了一半,但实际游戏里它们却是一样的。而火枪手的碰撞数据是32,看似只比步兵大了1/32,但实际上却是大了整整一倍。


那是因为其实16就是最小方块。每小于16算成16。每满16就算成下一个16。所以呢,农民的碰撞看似是16,实际却是32(因为它大于等于16)。步兵的碰撞数据是31,但是由于没到32,所以还是32。火枪手是32,所以跳到了48。

所以结果这三个数字只有32和48两档。顺便攻城坦克写着48,实际却是64


所以war3的碰撞数据其实是相当不科学的。数字不准还跳档。而十字围杀的效果这么好其实也并非是设计本意,是模拟结果不完美所致。

============以上是原理分析==============

当然这东西已经是既成事实,所以可能有些电竞向的玩家会更愿意能在sc2里面再现这个东西。但是显然,回过头去采用小方格子是不现实的,先不说sc2的圆形碰撞是早已写死的代码。就算强行用触发器来模拟,根本就是找死。这游戏会卡得不能玩的。你让那些自定义地图怎么办?

那么,就没有其他方法了吗?我们这里再来考察一下,为什么sc2标准对战里做不到十字围杀?是否可以解决那些因素?

原因1:单位“软碰撞”范围太大了。有时候很多单位站在一起后,除了默认间隔外,其实可以挤得比默认间隔更小。

解决方案——把软碰撞的范围去掉就好了呗。


原因2:己方部队可以互相推开,有时候你一个兵站好了位置,结果在摆队形的时候被另一个兵给推开了,这样阵型就散了,没法形成“墙了”,敌人可以从缝隙里溜出来。

解决方案——所以,我在war3 Mod的标准对战中关闭了“己方推挤”的功能。(但是你依然可以在自定义游戏里使用这个功能)。

原因3:因为碰撞是圆的,所以相比方形模拟出来的碰撞,东西、西南、南北、东南的空隙较大。

解决方案——其实说穿了也简单,我们把每个陆军的碰撞半径改大一点,用来补偿这一点就好了。当然也不能改的太大,毕竟这样单位的水平距离就会拉远了。由于war3的碰撞原是方形,所以我们只要让碰撞圆的大小为原方形的外接圆便可完全填满四个斜向角落的所有空隙。不过这样一来会让单位在正方向上显得太胖。

而做成内切圆则正方向上距离能保证一致,而且这才是最符合war3原始设计的情况,只是斜向空隙会变得较大。


grid.jpg


所以,目前的方案是……

——小学学的圆面积公式还记得吧

S=π*(r)^2

目前我在war3Mod里使用的单位碰撞圆面积就是保证了与war3的对应方块的面积一致,这样既大于内切圆又小于外接圆——中庸之道。


所以,来试试看效果如何?

croess111.gif.gif.gif

croess222.gif.gif.gif.gif




不错吧?非但出不去,而且四个角落还可以随便站,斜着站也可以,只要成互相垂直的十字就行,不像war3那样必须站X Y轴正向才能发挥最大效果。



因此这个War3 Mod,尽管没有完全复刻war3的方形碰撞(你说要完全一样,那不现实),依然可以实现那种十字围杀。其实只要去掉了软碰撞和己方推挤,很多问题就可以迎刃而解。

当然,这个方案还有待今后正式发布后的在线测试来吸收反馈和进一步完善,毕竟,一切都要以实际测试为准。



发表于 2015-1-4 12:32:05 | 显示全部楼层
涨姿势了0 0
回复

使用道具 举报

发表于 2015-1-4 14:12:38 | 显示全部楼层
我在那边的回复竟然显示在这里……好神奇的黑科技……
回复

使用道具 举报

 楼主| 发表于 2015-1-4 14:15:39 | 显示全部楼层
这里顺便说一下系数的计算好了。也就是通过方形碰撞的“伪半径”来求和这个方形同面积的圆形的半径,然后这个半径就是sc2里面的单位碰撞半径数值。

S=π*(r)^2

而这个S又等于方形面积。我们都知道方形面积公式是a^2,也就是边长的平方。那么这里要注意一点是我们不能直接把war3的伪半径带入到a里面。其实war3的伪半径指的是其方形碰撞的内接圆的半径,所以实际上是等于其边长的一半。固有

π*(x)^2=(2n)^2

x=Sqrt(4/π)n

即x=1.128379n


因此对于碰撞半径为31的步兵来说,最契合war3碰撞面积的数值这样计算,首先31不到32因此算32。32*1.128379=36。

然后实际上要变成sc2的距离数值还要除以个128,故步兵在sc2的最佳碰撞半径值为0.28125。

至于为啥要除个128。这个以后有机会再讲好了,这里涉及到war3距离和sc2距离的换算公式。


回复

使用道具 举报

发表于 2015-1-4 14:17:43 来自手机 | 显示全部楼层
话说我小学教的公式不是这样写的书上写S=πr2的平方,,,
回复

使用道具 举报

 楼主| 发表于 2015-1-4 14:21:39 | 显示全部楼层
^就是次幂符号啊,所以^2就是2次方。
回复

使用道具 举报

 楼主| 发表于 2015-1-4 14:47:28 | 显示全部楼层
Star_of_dada 发表于 2015-1-4 14:12
我在那边的回复竟然显示在这里……好神奇的黑科技……

因为就是从那边帖子里分割出来的,并不是重新写了一个帖子然后复制文字。
回复

使用道具 举报

发表于 2015-1-4 15:51:57 | 显示全部楼层
话说……这个“去掉软碰撞”的修改放到sc2的对战里面,会不会改善所谓的一坨争霸、deathball什么的?
回复

使用道具 举报

发表于 2015-1-4 15:54:09 | 显示全部楼层
这个有啥用
回复

使用道具 举报

发表于 2015-1-4 16:18:59 | 显示全部楼层
十字围杀
回复 0 1

使用道具 举报

 楼主| 发表于 2015-1-4 17:41:25 | 显示全部楼层
Star_of_dada 发表于 2015-1-4 15:51
话说……这个“去掉软碰撞”的修改放到sc2的对战里面,会不会改善所谓的一坨争霸、deathball什么的?

那就完全变样了。我无法说这到底会更好还是更坏。
回复

使用道具 举报

发表于 2015-1-4 18:59:03 | 显示全部楼层
本帖最后由 thewisp 于 2015-1-4 19:01 编辑

方形和圆形碰撞对于卡位的影响还在围杀之上,所以sc2里尽管不会推挤敌人单位但几乎不可能卡到单位。寻路算法的提升也是很重要的一点。
不过真要模拟war3的话,不论是怎么做到的,但它会连war3糟糕的一面都模拟。。例如一坨单位从一个路口回家需要操作n次才能挤进去。
p.s. 围杀并不一定非得4个单位,在更常见的情况下,war3里是很多个单位围一个目标却留下缺口失败。而在sc2里围杀的成功率本来就比war3高太多了。。。反而是卡位做不到
回复

使用道具 举报

发表于 2015-1-4 19:03:03 | 显示全部楼层
忘记sc2里hold以后是否还会被挤开了,好像还是会的
不过反正不被敌人挤开就行了? (参见风暴英雄中的围杀)

我倒是比较支持加入己方推挤,在更多情况下能获得好处
war3红血单位逃跑的时候也是手动拉单位让路的,现在回想一下其实挺麻烦的,在单位量大的时候,简单拉一下甚至都清不开通道
不过暴雪这方面一直做得不错,在一些其他RTS里,卡路严重到了无法忍受
比如Warhammer40K1,supreme commander1(2代专门弄了流体算法)
回复

使用道具 举报

发表于 2015-1-4 19:05:34 | 显示全部楼层
还有,war3也是有(很小的)己方推挤和软距离的,不过算法很bug。。用友军单位可以从背后把自己单位卡住。当然对敌人就不行啦。
回复

使用道具 举报

发表于 2015-1-4 19:08:17 | 显示全部楼层
不知sc2里能否对非建筑单位开启建筑碰撞的footprint?至少那个是方形的吧
回复

使用道具 举报

发表于 2015-1-4 19:09:51 | 显示全部楼层
麦德三世 发表于 2015-1-4 14:15
这里顺便说一下系数的计算好了。也就是通过方形碰撞的“伪半径”来求和这个方形同面积的圆形的半径,然后这 ...

war3里一个grid是128距离吧
回复

使用道具 举报

发表于 2015-1-4 21:00:35 | 显示全部楼层
长见识,以前听说dk的碰撞体积是长方形的。。。。。
回复

使用道具 举报

发表于 2015-1-4 21:48:14 | 显示全部楼层
麦德三世 发表于 2015-1-4 14:47
因为就是从那边帖子里分割出来的,并不是重新写了一个帖子然后复制文字。

魂器!!!!!!
回复

使用道具 举报

发表于 2015-1-4 22:10:43 | 显示全部楼层
长知识了。
回复

使用道具 举报

发表于 2015-1-4 23:07:22 | 显示全部楼层
fuhuodezero 发表于 2015-1-4 22:44
不愧是麦德三世!!你还能花时间来解释非常感谢,同时这篇答复也令在下十分满意!厉害厉害!

其实也许我 ...

有很多东西是介于bug和feature之间的。
比如,war3的很多建筑的可建造地形碰撞,与自身碰撞是两个不同的矩形
所以才会出现什么2个房子之间空一格 grunt过不去而食尸鬼可以
你说这个该算bug还是feature?两个房子斜造单位过不去,从视觉上非常不合理。。
sc2的建筑的碰撞设计的明显更加符合玩家的直观感受
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-12-22 10:50 , Processed in 0.119653 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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