请教: 3D 游戏中的各种因碰撞而导致的角色/载具抖动, 抽搐甚至飞天是如何造成的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Game Engines
Unreal Engine
MyCryENGINE
lujiaxing
V2EX    游戏开发

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

  •  
  •   lujiaxing 2024-09-02 19:46:51 +08:00 3352 次点击
    这是一个创建于 402 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    13 条回复    2024-09-06 12:27:14 +08:00
    ysc3839
        1
    ysc3839  
       2024-09-02 19:53:49 +08:00 via Android
    因为没有弹性?
    learnshare
        2
    learnshare  
       2024-09-02 20:02:05 +08:00
    碰撞检测和反馈,物理引擎
    xiangbohua
        3
    xiangbohua  
       2024-09-02 20:03:05 +08:00
    外行人,我估计是因为游戏里面的对象需要根据各种数据做判断互动后的新位置,比如碰撞之类的,可能有时候计算的结果不太符合实际情况,然后就飞了?
    KotoLyly
        4
    KotoLyly  
       2024-09-02 20:04:46 +08:00
    自身可以产生物理现象的游戏对象会加上刚体和碰撞体两个组件,自身不能产生物理现象但是需要碰撞就加上碰撞体。刚体和碰撞体发生接触,刚体会受力,往反方向移动。如果在一帧内,刚体移动的距离超过了碰撞体的厚度,物理引擎未能检测到碰撞,导致刚体进入到另一个碰撞体内部,在下一帧中,引擎会尝试将刚体推出,从而产生抖动或弹飞的现象。
    codehz
        5
    codehz  
       2024-09-02 21:22:11 +08:00
    搜索关键词
    连续碰撞检测 ( Continuous collision Detection / CCD )
    qcbf111
        6
    qcbf111  
       2024-09-02 21:36:04 +08:00
    哈哈哈哈刚刚问了下 gpt ,这个问题 gpt 不会。
    其实。。。主要原因是现在普遍都是模拟物理,因为要考虑性能就把角色或者车子是一整个整体作为刚体求解计算,而且大部分刚体的计算的是离散的也很难做到接触到表面时表现的比较正常的力,因为很可能两个物体穿插在一起多少是不定的。
    而现实中是甚至小到原子分子的。其实也能做到更加接近,好像有游戏完全通过 voxel 来构建物理世界,这样比如一堆车子爆炸能做到类似现实中炸的七零八落的而不是车子作为整体飞天了。
    yucao
        7
    yucao  
       2024-09-02 21:39:05 +08:00   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 穿插,关节链接等等相关),就会出现这种情况,这是物理引擎中老大难的问题,所有的物理引擎都会出现这种情况,只能尽可能规避无法避免,归根到底就是时间步在游戏中无法无限细分,而现实中的碰撞可以看成时间步是连续无限小的
    n0099
        8
    n0099  
       2024-09-03 02:42:08 +08:00
    n0099
        9
    n0099  
       2024-09-03 02:42:16 +08:00   2
    MegrezZhu
        10
    MegrezZhu  
       2024-09-03 04:49:51 +08:00   3
    计算机模拟里面,计算是离散的(比如按 x 毫秒更新状态、每帧更新状态),很容易导致两个物体在空间上冲突(嵌入);而计算机的物理模拟中,物体基本上都是刚体,两个刚体互相嵌入事实上形成了一个比较矛盾的状态:现实中的物体可以形变吸收力,而模拟中没有形变、又因为坐标上的矛盾很容易出现 x/0 (近似零)产生极大的值,于是结果上就变成飞天了又或者继续被互相嵌合的另一个刚体拉回来,产生高速震荡 ~~如此高速运转的机器进入模拟~~
    cheng6563
        11
    cheng6563  
       2024-09-03 09:30:56 +08:00
    俩模型有点重合怎么办?
    1.不管,直接穿透
    2.卡主
    3.试着用碰撞模型让他俩互相挤开
    volvo007
        12
    volvo007  
       2024-09-03 22:03:13 +08:00
    @cheng6563 我去,血压上来了
    lujiaxing
        13
    lujiaxing  
    OP
       2024-09-06 12:27:14 +08:00
    @MegrezZhu 也就是说目前游戏引擎还很难做到实现弹性形变, 材料形变以及屈服点这些东西, 所以经常会出现两个刚体模型直接嵌合, 导致计算机不得不反复计算互相排斥的力以保证可以解除嵌合状态. 而计算这种反作用力的时候又因为反向嵌合或其他什么原因导致计算出 0 甚至负数的情况最终导致飞天, 我这么理解对么?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3581 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 05:09 PVG 13:09 LAX 22:09 JFK 01:09
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86