V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Game Engines
Unreal Engine
MyCryENGINE
lujiaxing
V2EX  ›  游戏开发

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

  •  
  •   lujiaxing · 14 天前 · 1927 次点击

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

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

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

    13 条回复    2024-09-06 12:27:14 +08:00
    ysc3839
        1
    ysc3839  
       14 天前 via Android
    因为没有弹性?
    learnshare
        2
    learnshare  
       14 天前
    碰撞检测和反馈,物理引擎
    xiangbohua
        3
    xiangbohua  
       14 天前
    外行人,我估计是因为游戏里面的对象需要根据各种数据做判断互动后的新位置,比如碰撞之类的,可能有时候计算的结果不太符合实际情况,然后就飞了?
    KotoLyly
        4
    KotoLyly  
       14 天前
    自身可以产生物理现象的游戏对象会加上刚体和碰撞体两个组件,自身不能产生物理现象但是需要碰撞就加上碰撞体。刚体和碰撞体发生接触,刚体会受力,往反方向移动。如果在一帧内,刚体移动的距离超过了碰撞体的厚度,物理引擎未能检测到碰撞,导致刚体进入到另一个碰撞体内部,在下一帧中,引擎会尝试将刚体推出,从而产生抖动或弹飞的现象。
    codehz
        5
    codehz  
       14 天前
    搜索关键词
    连续碰撞检测 ( Continuous collision Detection / CCD )
    qcbf111
        6
    qcbf111  
       14 天前
    哈哈哈哈刚刚问了下 gpt ,这个问题 gpt 不会。
    其实。。。主要原因是现在普遍都是模拟物理,因为要考虑性能就把角色或者车子是一整个整体作为刚体求解计算,而且大部分刚体的计算的是离散的也很难做到接触到表面时表现的比较正常的力,因为很可能两个物体穿插在一起多少是不定的。
    而现实中是甚至小到原子分子的。其实也能做到更加接近,好像有游戏完全通过 voxel 来构建物理世界,这样比如一堆车子爆炸能做到类似现实中炸的七零八落的而不是车子作为整体飞天了。
    yucao
        7
    yucao  
       14 天前   ❤️ 1
    之前在腾讯专门负责过游戏里面的 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 穿插,关节链接等等相关),就会出现这种情况,这是物理引擎中老大难的问题,所有的物理引擎都会出现这种情况,只能尽可能规避无法避免,归根到底就是时间步在游戏中无法无限细分,而现实中的碰撞可以看成时间步是连续无限小的
    h0099
        8
    h0099  
       14 天前
    h0099
        9
    h0099  
       14 天前   ❤️ 2
    MegrezZhu
        10
    MegrezZhu  
       13 天前   ❤️ 3
    计算机模拟里面,计算是离散的(比如按 x 毫秒更新状态、每帧更新状态),很容易导致两个物体在空间上冲突(嵌入);而计算机的物理模拟中,物体基本上都是刚体,两个刚体互相嵌入事实上形成了一个比较矛盾的状态:现实中的物体可以形变吸收力,而模拟中没有形变、又因为坐标上的矛盾很容易出现 x/0 (近似零)产生极大的值,于是结果上就变成飞天了——又或者继续被互相嵌合的另一个刚体拉回来,产生高速震荡 ~~如此高速运转的机器进入模拟~~
    cheng6563
        11
    cheng6563  
       13 天前
    俩模型有点重合怎么办?
    1.不管,直接穿透
    2.卡主
    3.试着用碰撞模型让他俩互相挤开
    volvo007
        12
    volvo007  
       13 天前
    @cheng6563 我去,血压上来了😅
    lujiaxing
        13
    lujiaxing  
    OP
       10 天前
    @MegrezZhu 也就是说目前游戏引擎还很难做到实现弹性形变, 材料形变以及屈服点这些东西, 所以经常会出现两个刚体模型直接嵌合, 导致计算机不得不反复计算互相排斥的力以保证可以解除嵌合状态. 而计算这种反作用力的时候又因为反向嵌合或其他什么原因导致计算出 0 甚至负数的情况最终导致飞天, 我这么理解对么?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   950 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:43 · PVG 03:43 · LAX 12:43 · JFK 15:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.