-
2010-01-16
2.8f 与 3.6f | 魔术参数与玩家体验 - [竞速大论]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://fxcarl.net/logs/56449201.html
(前面三张图在Bus服务器,后面几张盗链自天纵自家官网,可能会失效)
前阵子Bus不能访问,于是正好使得FXCarl这种更新懒人也显得不那么懒了许多。虽说不知道Bus还是不是会继续出现之前的情况,但是由于这几年下来一直都在用,习惯一下也改不了,大致也就是通过勤劳备份来防止悲剧的发生吧。

2010年伊始,《飚车世界》的团队就有了些小变动。细节暂且不表,比较值得一说的是 FXCarl 可以开始正式受许可的进行代码工作了。亲手打造一款赛车模拟引擎可以说一直是 FXCarl 的梦想之一,激动之余便是立即投入其中开始寻找一些一直想知道的东西。
《飚车世界》(以后简称RW)是以往《飚车》的延伸。因此驾驶体验也是和飚车一脉相承。相信访问 CodeFXCarl 的读者很多人都有玩过。通常来说大家都会觉得这个款游戏有点怪怪的,加速的节奏奇怪,过弯的时候车子不像是在好好的运动,刹车的时候总觉得轮胎被抱死了个结实……反正,玩的竞速游戏越多,越会觉得这款游戏很不可思议。然后就又很快的就退出游戏删除客户端了。这显然不是一个好结果,一定有什么地方蹊跷。

RW的技术最早的技术基础脱胎于SEGA的一些积累。因此从最最基础的细节来讲,是有很高的视角的。实现了一些诸如 Toe(束角)、Camber(倾角)、Caster(主销后倾) 这样的车辆悬架几何参数,轮胎的建模上也考虑到了 Pacejka 公式中关于载荷变化的参数,引擎也有转动惯量的考量等等。但是毕竟技术古老,且长期未受到良好的维护,很多部分至今仍然显得非常原始和不完善。
不过即便是不完善,也应该不会觉得这么怪。在不断翻看代码的过程中,FXCarl 注意到了一个很敏感的常数: 2.8f —— 一个值为 2.8 的浮点数。通常来说,赛车游戏为了实现一些比较特殊的效果,会采用一些魔术参数。譬如 CodeMaster 会加大“地球引力”啦等等。那么这个 2.8f 又会是什么呢?进一步的调查中发现,这个 2.8f 似乎并不是某个魔术参数,而是与速度和距离有很大的关系:在游戏引擎中,计算大部分是以国际标准单位米、秒为计算单位的。而实际游戏中大部分向玩家展示速度的场合使用的是公里、小时等单位。

很多朋友都会记得一个比例 100km/h 大约是 28m/s,也就是 100 公里的时速大约是 28 米每秒( FXCarl 常用的是 27m/s 做计算)。具体算来是这样的:
100km = 100000m, 1 h = 3600s, 100km/h = 100000/3600 = 27.78 m/s
恩,看起来 1km/h 的速度是 0.28 m/s …… 100km/h 的速度是 28m/s …… 很好很好。然后在 RW 中,以往的代码犯下了一个致命的单位换算错误。他们把 2.8 作为了公里每小时和米每秒的换算参数!而实际上,按照 SI 国际标准,两者的换算标准是:
3.6 km/h ≡ 1 m/s, 100(km/h) / 3.6 = 27.77(m/s)
换而言之,在计算的换算中,公里每小时和米每秒的换算参数应该是 3.6 而不是 2.8 !
那么实际的游戏中,这个参数会带来怎样的区别呢?其实经过后来的代码调查,对物理计算的影响并不是非常大。因为这种换算大部分都存在于游戏规则设计和显示部分。要说对开发上有什么严重的后果的话最大也就是在策划们设计车辆参数时,总是发现速度被额外的吞噬——根据引擎转速、变速箱减速、轮胎半径后,得出的速度与实际车速不符。

但是如果把角度转向玩家的一侧,则完全不同。它并不简单的是一个单位缩水问题。在一个竞速游戏玩家脑海中,会有很多很神奇的数字,其中有一个叫做 g,也就是大家说的重力加速度 9.8m/s^2。众所周知,汽车所产生的运动都来自于轮胎与地面的摩擦力,而在橡胶轮胎上,这个摩擦系数大约是1。也就是说,可以产生和重量等量的摩擦力。这个公式算起来有趣的:
摩擦力方面,摩擦公式 f = μ*n 中 n 为垂向力,单位是牛顿(N)。于是咱想啊,汽车站在地上,不用说四个轮胎着地的总垂向力肯定是等于车重的。而在目前的轮胎上,μ 常为 1。在牛顿的 f = m*a 当中,m 的单位是 Kg ,而力的单位是 N 。与上面的公式凑凑,发现变成了 n = m*a。很自然的,a 就等于 kg 和 N 的换算比例咯。总结成一句话吧,借助橡胶轮胎,汽车在水平面上大部分时候总是可以以一个 g 的加速度来改变运动状态的。
那么这个 g 怎么用呢?大家会拿来估算转弯速度:
a = v^2/r 这个公式估计大家不太熟悉了,这个公式可以计算一个物体圆周运动时的向心加速度。稍微挪挪模样就会发现,r = v^2/a。接下来我们把轮胎的参数直接嵌入进去的话,大致是 r=v^2/10。哇塞,原来只要有速度,就可以得到车辆在当前速度下的转弯半径的!
实事就是这样。尽管大多数的竞速游戏玩家并不精通物理。但是这些简单的概念已经在长期的游戏过程中逐步积累形成。而如果以RW采用的 2.8f 作为换算系数,我们会得到一个很有趣的结果:当玩家看到一个半径约为80米左右的弯道时,大家会自然而然的认为自己的车速应该是在100公里每小时的样子。但是在RW中,以100公里每小时的时速,得到的转弯半径却是127米以上!结果只有撞墙……
这样的落差对于任何人来说都是难以适应的。而如果我们把过弯的半径锁定在80米的话,那么这个时候,玩家入弯的速度就要在转速表上看来达到75公里每小时的水平。而这个速度对于大多数玩家来说都会慢的无法接受。相信不会有太多玩家喜欢时速总是在“100以下”的赛车游戏。

如果继续展开的话,还有很多很多的话题可以说。但是 FXCarl 觉得点到这里,应该就已经很直白了:很多玩家带着以往的竞速游戏积累来到RW。然后却被各种速度的显示所愚弄,以往积累的技巧在隐藏数字之下变得毫无价值——你只能战胜你看的见的对手,不是吗?而现在,我们应该考虑改掉它。
正确的单位是游戏获得优秀体验的基础,也是进一步优化游戏的基础。尽管目前 FXCarl 也不知道这项问题是否会应用将来向玩家发布的版本中去。但是我们不难发现,其实很多游戏体验的构成,是被一些比大家所想象的细节更为细小的东西所影响的。
FXCarl 对 RW 的工作仍然继续,相信在这样的一个平台之上,会有不断的惊喜。

收藏到:Del.icio.us






评论
最近跟国内朋友联nfs:shift,500ms+的延迟都很顺畅,爽~