• 2010-01-24

    悬架预载与对不齐的轮胎位置 - [竞速大论]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://fxcarl.net/logs/56947806.html

    如果把关于飚车世界的文章作为一个系列的话,这个系列的名字差不多可以叫做  R-World Tuned Project —— 飚车世界改装版计划。

    其实在与广大玩家见面的《飚车世界》之外,还有一个并不为大众所见的《飚车世界》。它拥有更为前沿的设计细节,它们有些很有趣,有些很特别。经过完整的周边完善和精密测试之后,才有一定几率出现在最终的玩家版本之中。而这个系列文字,就是关于这个神秘版本的。按照汽车行业的习惯,我们不妨把它叫做 Tuned Version —— 改装版。

    上次的选题是围绕一个Bug展开的,这次则从一个有趣的工作流程开始:如何设定车轮的位置。

    美术的DCC工具中,赛车的姿态总是完美无暇,可是这种完美可以直接还原到游戏中来吗?答案是——不能。在赛车游戏中,实际的轮胎位置是由游戏的物理演算后最终决定的。它们在游戏的过程中不断变化,与美术制作时的静态美互补的,这种动态的变化形成了美妙的车辆动态特征。

    实际的工作流程中,美术在制作完成一台车辆后将其导出为游戏使用的格式。然后由策划来配置悬架的物理的参数,最后导入游戏中完成车轮与车身的配合……我们不妨以一个惯常数据作为开始,譬如针对一个前后重量平衡 50:50 的  1500kg 车辆,我们设定每个悬架是统一的 70KN/M 的弹性,这是一个很普通的弹簧参数。 

    正在一切看起来都将会正常的时候,问题出现了 …… 1500kg 的车身分摊到每个悬架上的压力大约得有个 3.7KN。对于 70KN/M 弹性的弹簧来说,需要压缩个至少 5cm 的长度才能提供这么大的支撑力。这个时候从视觉上看来,与美术同事们期待的完美效果不同:轮胎已经悲剧的陷到车身里面去了……

    初看起来,这个问题好像挺简单,我们只需要将轮胎的原始位置向车身下方移动,让车轮支撑高度自然收缩之后就可以得到理想的车轮位置了。就算偷懒不想计算悬架力,只要不怕辛苦凭视觉反复调整个几次也可以获得不错的效果。通常当距离误差小于 2cm 的时候,就已经不易再被察觉。

    貌似看起来车轮的定位问题已经解决了——首先我们设定一个想要的弹簧参数,然后根据车身重量计算或者实际试验一下可能被压缩的行程。然后将这个行程偏移到车辆的初始化参数里。然而,真正的挑战才刚刚开始。

    在内部的测试调整阶段,我们会不断的修正弹簧的强度。而此时的悬架长度怎么办?它必须被不断调整才能保证车身位置的正常。或许我们有的是耐心,可以慢慢调整。那么到了玩家那里会如何?如果玩家使用改装功能变化了车辆的悬架参数怎么办?那时我们已经没有办法再调整弹簧的行程偏移了!

    最终,我们看到了玩家常常驾驶着浮空的赛车在赛道、城市之间来往穿梭……实在是谈不上一种胜景。或许会有一个直接的想法冒出来——我们为什么不为每种改装零件参数单独设置一个行程偏移,然后保存在道具的属性里呢?

    R8的后悬结构

    其实真正问题的解法根本不是上面这样的,这种奇怪的轮胎位置变化问题本身就不应该存在。它本质上,是一个物理模拟的缺陷。

    如果我们调整弹簧的软硬,的确应该是会影响弹簧在接受同样压力时的长度,这一点是物理正确的。但是同时,在汽车上改变悬架弹簧软硬的时候,不会改变车身的高度这一点也是现实的情况。这一组矛盾究竟是怎么回事呢?

    这一切想要说清楚,必然得从悬架开始说起。我们知道现实不是游戏,悬架的可用行程并不是无限的。像上面我们举例的这种悬架行程需要按照弹簧软硬进行缩放的情形即使想在现实中还原也无法做到。那么现实中的工程师是怎么做的呢?他们采用了非常简单而直接的做法——先把弹簧压短一些,然后把它们装到车辆的悬架上去。这样车辆的悬架不需要下沉很长的距离就可以支撑住车身了,因为预先压缩的弹簧长度已经帮助悬架完成了这一点。

    图片来源:http://auto.howstuffworks.com/car-suspension.htm

    而这个预先把悬架弹簧预先压短的设置,称作悬架预载。它带来的结果是很容易直观体验的。如果压在弹簧上的力不超过预载力的话,弹簧就不会有明显的压缩。在设定预载的时候,比较软的弹簧就压缩的多一些,比较硬的弹簧就压缩的少一些。

    R8 悬架实拍照片

    对于游戏而言。预载是一个更加容易获得和拥有良好使用效果的玩意。因为在游戏中,我们其实并不需要去真的压缩弹簧,只是告诉悬架有一个预载力的存在即可。

    一般来说,简单的车辆模拟游戏会把车轮和车身的连接作为一个理想的弹簧阻尼系统来对待:

    悬架支撑力 = 弹簧劲度系数 * 压缩长度 + 阻尼系数 * 悬架升降速度

    而我们想要获得预载力的话,其实只需要这样即可:

    先做一个判定,当悬架的压缩行程为0或者小于0的时候,预载力为0。

    悬架支撑力 = 弹簧劲度系数 * 压缩长度 + 阻尼系数 * 悬架升降速度 + 预载力

    如此这般,我们就得到了一个与现实中相似,拥有预载力的理想悬架模型了。通过一个简单的修改,策划在设定轮胎的位置时就再也不必苦恼那令人生厌的弹簧与悬架高度的绑定。只需要给予一个对应支撑车身重量的预载力,然后设定弹簧的劲度即可。无论软硬,车轮与车身的位置都几乎稳定。

    更重要的是,当有了预载力之后,游戏中的车辆运动时也变得与现实更加接近起来。玩家对车辆的改装也会与现实一样,不必再担心赛车会在手中变成浮空的气垫船。

    有没有发觉?其实很多关于赛车游戏的问题,都并不是表面上看到的模样。只有把事情做到更正确,游戏的表现才会更好。好吧,这一次就写这么多,下一次我们继续悬架模拟中的另一个有趣问题。


    收藏到:Del.icio.us

    评论

  • 预载力有点意思哦~

    看完之后大概想到个问题,不知道是不是对飙车这个游戏适用。。
    阻尼的强度不知道是不是随着"弹簧的强度和悬挂高度“的改变而改变呢,是的话大概能提升下车辆过弯时候的动态效果。。不过这又是一笔计算量吧。。很难平衡额。
    回复E_D_sic说:
    阻尼的设计结构就是根据运动速度产生力的玩意

    如果希望根据不同的车身侧倾产生不同的阻尼的话,就是主动悬架系统了

    主动悬架系统的实现分两部分,一部分是机械结构,一部分是控制算法。机械结构在游戏中实现是无成本的。但是控制算法却是很复杂的 …… 究竟什么时候应该变更强或者更弱? 弱多少 ? 都是问题
    2010-02-07 14:39:21
  • 话说还有一个问题哦,在调节车身高度时,游戏里会不会同时调节弹簧刚度的?
    貌似在真车上直接拧主销会在降车身高度的同时把悬架硬度也提上去了。。。游戏里呢?
    回复AquaJ说:
    真车也看设计的,有的是预载和车身高度绑定的,有的不是。
    弹簧的一头是硬点,另外一头看是与阻尼筒绑定还是与阻尼杆绑定。
    2010-01-27 15:02:14
  • 抛开机能不能说,游戏物理引擎是不是可以当工程引擎用?

    比如山内哪天弄一台透明车的CG影片出来,只读油门深度和方向盘角度,剩下的所有车身动态全部靠物理引擎自己算。

    PS:其实咱是来问PSP每个月都会变的那个背景颜色的专用名词是什么……找不到了……
    回复宅男的爱说:
    显然不能,精度差的多不谈,模拟的深度的也不够,很多细节都漏掉了。

    PSP 的背景色这里找 http://en.wikipedia.org/wiki/XrossMediaBar
    2010-01-26 20:44:08
  • 是直接加上预载力这样么。。。觉得会造成问题。。
    个人觉得用一个“预载长度”的定义比较好。因为预载力的本质就是弹簧初始长度相较其自然长度有改变,在一个等距弹簧模型中“预载长度”“预载力”没有什么区别,但如果不等螺距的弹簧,这里是不是会造成很诡异的现象。。。
    回复AquaJ说:
    其实预载长度的话还是会造成每款道具要单独设定的。

    做游戏是要平衡一下生产率和效果的平衡的,除非有很多免费的技术劳工哈哈
    2010-01-26 20:45:13
  • FK了,不注册还不让回复
    引擎里不包括对车身质量的定义么
    回复haozhibof1说:
    正是因为包括对重力的设定,才会造成无法对齐轮胎的情况
    2010-01-25 22:11:16
  • 啥时候电脑能发展到这种水平呢?离《黑客帝国》的场景不远了吧?
    回复alex310110说:
    似乎没有那么精确的必要吧
    2010-01-25 22:14:57
  • 学习了.........................
    果然总策划就是不一般
    回复mustang说:
    ……客气话就很受用的收下了
    2010-01-24 22:14:13
  • 啥时候每个气缸啥的都是用PhysX直接物理计算,那就好玩了。。。
    回复alex310110说:
    细节太多了不一定好玩,而且每个气缸的计算工作现有的通用物理引擎也胜任不了
    2010-01-24 22:13:18