请教: 3D 游戏中的各种因碰撞而导致的角色/载具抖动, 抽搐甚至飞天是如何造成的?

73 天前
 lujiaxing

请做过游戏的大佬们帮我答疑解惑.

例如 PUBG, GTA 这类 3D 游戏, 经常会遇到一些情况: 比如角色或物品被压住, 如果是按真实的世界, 不管是尸体还是什么被压住就是被压住, 不会无限反弹. 两个物品之间的受力最终也会达到平衡而静止. 但是在一些 3D 游戏里就经常会看到角色或物品在与其他物品接触的时候会不断的抖动, 甚至抽搐变形. 严重的甚至可能会造成飞天 (例如鲁大能通过层叠车辆并炸飞导致了远超出直接炸飞所产生的效果)

诸位大佬能否从技术的角度说说这种情况是如何造成的? 什么原理?

2372 次点击
所在节点    游戏开发
13 条回复
ysc3839
73 天前
因为没有弹性?
learnshare
73 天前
碰撞检测和反馈,物理引擎
xiangbohua
73 天前
外行人,我估计是因为游戏里面的对象需要根据各种数据做判断互动后的新位置,比如碰撞之类的,可能有时候计算的结果不太符合实际情况,然后就飞了?
KotoLyly
73 天前
自身可以产生物理现象的游戏对象会加上刚体和碰撞体两个组件,自身不能产生物理现象但是需要碰撞就加上碰撞体。刚体和碰撞体发生接触,刚体会受力,往反方向移动。如果在一帧内,刚体移动的距离超过了碰撞体的厚度,物理引擎未能检测到碰撞,导致刚体进入到另一个碰撞体内部,在下一帧中,引擎会尝试将刚体推出,从而产生抖动或弹飞的现象。
codehz
73 天前
搜索关键词
连续碰撞检测 ( Continuous collision Detection / CCD )
qcbf111
73 天前
哈哈哈哈刚刚问了下 gpt ,这个问题 gpt 不会。
其实。。。主要原因是现在普遍都是模拟物理,因为要考虑性能就把角色或者车子是一整个整体作为刚体求解计算,而且大部分刚体的计算的是离散的也很难做到接触到表面时表现的比较正常的力,因为很可能两个物体穿插在一起多少是不定的。
而现实中是甚至小到原子分子的。其实也能做到更加接近,好像有游戏完全通过 voxel 来构建物理世界,这样比如一堆车子爆炸能做到类似现实中炸的七零八落的而不是车子作为整体飞天了。
yucao
73 天前
之前在腾讯专门负责过游戏里面的 Ragdoll 部分,对于这部分有一点研究,如果 lz 想要详细了解,可以参考这些文章和视频:
https://forum.unity.com/threads/fixed-sort-of-ragdoll-stability.285980/
https://docs.unity3d.com/Manual/RagdollStability.html
[Unity2015 Boston Physics]( https://docs.qq.com/pdf/DWlhZZWVRZXloenRS)
<amp-youtube data-videoid="kJxVCiFn3mA" layout="responsive" width="480" height="270"></amp-youtube>?t=756
简单来说,物理模拟的解算中大部分情况下都是收敛的,但是部分情况下不收敛(跟时间步大小,刚体质量差,Collider 穿插,关节链接等等相关),就会出现这种情况,这是物理引擎中老大难的问题,所有的物理引擎都会出现这种情况,只能尽可能规避无法避免,归根到底就是时间步在游戏中无法无限细分,而现实中的碰撞可以看成时间步是连续无限小的
h0099
73 天前
h0099
73 天前
MegrezZhu
73 天前
计算机模拟里面,计算是离散的(比如按 x 毫秒更新状态、每帧更新状态),很容易导致两个物体在空间上冲突(嵌入);而计算机的物理模拟中,物体基本上都是刚体,两个刚体互相嵌入事实上形成了一个比较矛盾的状态:现实中的物体可以形变吸收力,而模拟中没有形变、又因为坐标上的矛盾很容易出现 x/0 (近似零)产生极大的值,于是结果上就变成飞天了——又或者继续被互相嵌合的另一个刚体拉回来,产生高速震荡 ~~如此高速运转的机器进入模拟~~
cheng6563
73 天前
俩模型有点重合怎么办?
1.不管,直接穿透
2.卡主
3.试着用碰撞模型让他俩互相挤开
volvo007
72 天前
@cheng6563 我去,血压上来了😅
lujiaxing
69 天前
@MegrezZhu 也就是说目前游戏引擎还很难做到实现弹性形变, 材料形变以及屈服点这些东西, 所以经常会出现两个刚体模型直接嵌合, 导致计算机不得不反复计算互相排斥的力以保证可以解除嵌合状态. 而计算这种反作用力的时候又因为反向嵌合或其他什么原因导致计算出 0 甚至负数的情况最终导致飞天, 我这么理解对么?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1069708

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX