请做过游戏的大佬们帮我答疑解惑.
例如 PUBG, GTA 这类 3D 游戏, 经常会遇到一些情况: 比如角色或物品被压住, 如果是按真实的世界, 不管是尸体还是什么被压住就是被压住, 不会无限反弹. 两个物品之间的受力最终也会达到平衡而静止. 但是在一些 3D 游戏里就经常会看到角色或物品在与其他物品接触的时候会不断的抖动, 甚至抽搐变形. 严重的甚至可能会造成飞天 (例如鲁大能通过层叠车辆并炸飞导致了远超出直接炸飞所产生的效果)
诸位大佬能否从技术的角度说说这种情况是如何造成的? 什么原理?
1
ysc3839 84 天前 via Android
因为没有弹性?
|
2
learnshare 84 天前
碰撞检测和反馈,物理引擎
|
3
xiangbohua 84 天前
外行人,我估计是因为游戏里面的对象需要根据各种数据做判断互动后的新位置,比如碰撞之类的,可能有时候计算的结果不太符合实际情况,然后就飞了?
|
4
KotoLyly 84 天前
自身可以产生物理现象的游戏对象会加上刚体和碰撞体两个组件,自身不能产生物理现象但是需要碰撞就加上碰撞体。刚体和碰撞体发生接触,刚体会受力,往反方向移动。如果在一帧内,刚体移动的距离超过了碰撞体的厚度,物理引擎未能检测到碰撞,导致刚体进入到另一个碰撞体内部,在下一帧中,引擎会尝试将刚体推出,从而产生抖动或弹飞的现象。
|
5
codehz 84 天前
搜索关键词
连续碰撞检测 ( Continuous collision Detection / CCD ) |
6
qcbf111 84 天前
哈哈哈哈刚刚问了下 gpt ,这个问题 gpt 不会。
其实。。。主要原因是现在普遍都是模拟物理,因为要考虑性能就把角色或者车子是一整个整体作为刚体求解计算,而且大部分刚体的计算的是离散的也很难做到接触到表面时表现的比较正常的力,因为很可能两个物体穿插在一起多少是不定的。 而现实中是甚至小到原子分子的。其实也能做到更加接近,好像有游戏完全通过 voxel 来构建物理世界,这样比如一堆车子爆炸能做到类似现实中炸的七零八落的而不是车子作为整体飞天了。 |
7
yucao 84 天前 2
之前在腾讯专门负责过游戏里面的 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) ?t=756 简单来说,物理模拟的解算中大部分情况下都是收敛的,但是部分情况下不收敛(跟时间步大小,刚体质量差,Collider 穿插,关节链接等等相关),就会出现这种情况,这是物理引擎中老大难的问题,所有的物理引擎都会出现这种情况,只能尽可能规避无法避免,归根到底就是时间步在游戏中无法无限细分,而现实中的碰撞可以看成时间步是连续无限小的 |
8
h0099 84 天前
|
9
h0099 84 天前 2
|
10
MegrezZhu 84 天前 3
计算机模拟里面,计算是离散的(比如按 x 毫秒更新状态、每帧更新状态),很容易导致两个物体在空间上冲突(嵌入);而计算机的物理模拟中,物体基本上都是刚体,两个刚体互相嵌入事实上形成了一个比较矛盾的状态:现实中的物体可以形变吸收力,而模拟中没有形变、又因为坐标上的矛盾很容易出现 x/0 (近似零)产生极大的值,于是结果上就变成飞天了——又或者继续被互相嵌合的另一个刚体拉回来,产生高速震荡 ~~如此高速运转的机器进入模拟~~
|
11
cheng6563 84 天前
俩模型有点重合怎么办?
1.不管,直接穿透 2.卡主 3.试着用碰撞模型让他俩互相挤开 |