FPS 游戏是如何防止枪械与场景穿模的?

前段时间玩《Squad》发现紧贴着墙壁或地面的时候,枪头会插进墙壁/地面,但是《使命召唤》《战地》系列就不会出现这种穿模的情况,请问这是怎么做到的?
关注者
207
被浏览
218,653

30 个回答

2月28日再补充点:


其实枪械穿墙还不是最大的噩梦。R6里最操蛋的是----腿儿!

匍匐是个重要战术动作。根据3C team的要求,这也是个游戏系统不可以切掉的战术姿态。于是,你在地上爬,可以在地上转,可以趴着上楼梯。。。。反正你只要不下站立的指令人物就不能站起来。

然后就悲剧了,你爬进狭小的走道里,或者你贴着墙趴着,突然想看另一个方向。你上半身是转过来了,但是这时候你的腿儿放哪里?

这个我已经记不清怎么解决的了,貌似是靠FEETIK 把腿卷起来?反正不但很奇怪,而且非常不可靠 ,估计不少人就这么送了性命。。。。

物理程序员的噩梦列表前三条,Character Controller, Character Controller, Character Controller!

终极的解决办法是不用传统的Character Controller,而是做一套完全基于骨架的控制,但是能不能用在R6这种战术电竟游戏上,我心里没底。

================================================

这个问题很复杂,取决于游戏类型和你的需求。
很多答案提到用一些渲染技巧来解决问题。这种方法很好实现,但是在多人游戏下很受限制。联机玩家永远看到的是你的选择TPS模型,你也不太好hack渲染。

作为一个有尊严的游戏设计师,你决不想一个玩家看到墙里突然冒出的半截枪管就对着墙一通乱扫赚人头。

所以在多人游戏里,你需要尽量把墙做厚,把枪做短。还有,别忘了要求动画大爷们不要不顾METRIC追求艺术效果。但是,有尊严的LD和美术还有动画可能会掀桌子骂娘。准备好撕逼吧。

现在,假设你撕不动他们,那该怎么办?你可以去找物理程序,让他给你把枪械上加上collision , 然后找个GPP加一个feature: 如果枪械碰到墙了,把枪垂下。这个不难搞,程序最多就是几天的事儿。让人把数据加上,加个动画,齐活!

现在,你跳槽了,你的新项目是个竞技射击游戏。你的项目又出现了枪械穿墙的问题,你信心满满,不就是把枪放下吗?哥们我练过!

这时候GD老大提醒你,不行,我们是竞技游戏,玩家控制一切,游戏不能改变玩家的战术姿态!瞄准姿态不能因为蹭了墙就被切掉!

咋办?

R6为这个撕过无数的逼。解决办法有两个:如果枪械碰墙,强行往后平移!是的你没看错。当然还需要hand IK配合才不会太奇怪。当然这看起来多少不太自然,像另一个答案说的,枪像是扛在肩上。

本来这应该就够了。但是R6的枪......太他妈长了!墙......太他妈薄了。那些可破坏的石膏板,木门....。所以把枪扛着有时还不够。还有探员们打手枪的姿势太销魂了,手都要穿枪了,美术大爷们我知道这很帅但我们有尺寸规定的啊!

撕逼,撕逼。撕了无数次。最后实在没办法了,让LD把很薄的墙都打个标记,然后人物如果碰到这些薄物体,capsule就变大一点…如果没碰到,那就恢复原状。

是的我知道这很脏。如果你有更好的办法,请一定告诉我!

终极的解决方案,我想可能需要整个身体的IK。我还没看到哪个游戏这么干的。

做游戏就是这样,撕逼,讨价还价,越鸡贼越好

想起来啥再补充吧。

通宵写代码之后来写个答案(妈个鸡科兴的早晨真鸡儿冷)……

《使命召唤》、《战地》系列中,枪械不会穿模其实是可以实现的,主要是通过在VS中将枪械顶点往摄像机的方向进行移动+使用Panini Projection来修正通过移动造成的投影上的偏差。

所以,在真实的物理世界中,枪头也是穿进了墙壁的,但是在渲染的时候,通过VS将顶点拉出来,从而进行深度检测的时候可以保证枪械在墙壁之前。

具体的实现其实并不难,可以参考Unreal Tournament中的枪械的材质。