想象你是一座虚拟城市的开发商,正指挥两支施工队维护城市里的一切物理秩序:箱子落地不能弹飞、墙壁被撞不能穿模、大楼被炸要碎得漂亮。一支是英伟达旗下的老牌精工队 PhysX——出道二十多年,遍布几乎所有主流引擎,是业界公认的“老师傅”;另一支是 Epic 自建的新锐拆迁队 Chaos——只为自家 UE5 服务,上任第一仗就把《堡垒之夜》整座岛屿砸碎给全世界看。两支队伍干的是同一件事:让虚拟世界的石头像石头、墙像墙、爆炸像爆炸。本文带你走进两支队伍的总部,看看它们的刚体求解、碰撞检测、破坏体系与 GPU 加速有何异同,以及面对真实项目该如何选人用人。

岗位关联

掌握 PhysX 与 Chaos 的架构差异与选型逻辑,是游戏物理方向的 AI 工程师做技术选型、性能优化与仿真环境搭建的核心竞争力。

目录
  1. 可视化演示
  2. 引擎概览:两支队伍的身世
  3. 刚体求解器:搬运调度组
  4. 碰撞检测:防碰雷达
  5. 破坏体系统:拆迁爆破组
  6. GPU 加速:并联吊车
  7. Chaos 与 UE5:深度绑定
  8. 工程实践:开工决策
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示PhysX与Chaos物理引擎的刚体碰撞求解、破坏体系统与GPU并行加速对比。切换模式查看不同物理模拟,拖动滑块调节模拟参数。

本节配有交互动效(进入视口后自动加载,约 3KB)。

PhysX刚体碰撞求解 宽相位:AABB层次包围盒快速剔除不可能碰撞对 窄相位:GJK/EPA算法精确检测接触点与穿透深度 F_impulse = -(1+e) × v_rel / (1/m_a + 1/m_b) 脉冲法求解约束实现碰撞响应

引擎概览:两支队伍的身世

假设你要建一座虚拟都市,工地上有无数箱体、车辆、墙体需要“守规矩”——该落的落、该停的停、该碎的碎,这需要一支施工队来维护物理规则。第一支队伍叫 PhysX,是英伟达旗下的老牌精工队,出道二十余年,Unity、UE4 和无数自研引擎都找它干活,是游戏物理界公认的“老师傅”。第二支队伍叫 Chaos,是 Epic 自己养的新锐拆迁队,总部就设在 UE5 公司楼下,只服务一家客户。

老师傅和新锐队解决的是同一个问题:如何实时模拟物体运动。所谓“物理引擎”,就是负责碰撞、重力、约束等计算的软件模块。区别在于出身与取舍——PhysX 追求“到处都能用、稳定可靠”,Chaos 追求“与 UE5 深度咬合、把破坏场面做到极致”。PhysX 的前身来自 Ageia 公司(2008 年被 NVIDIA 收购),而 Epic 从 2018 年起在 UE4 中逐步用 Chaos 做试验性替代,到 UE5 时代正式转正为默认物理后端。2021 年《堡垒之夜》第二章第八赛季,整个岛屿在玩家眼前碎裂,正是 Chaos 破坏系统的成名战。

物理引擎并不跟渲染帧率走,而是按固定小步长推进,保证不同帧率下模拟结果一致:

选队伍之前先认人——PhysX 是“多面手老师傅”,Chaos 是“家门口的新锐”。接下来我们走进两者的“搬运调度组”(刚体求解器),看看它们怎么让箱子不乱飞。

Δt=1f=160 s≈16.67 ms\displaystyle \Delta t = \frac{1}{f} = \frac{1}{60}\,\text{s} \approx 16.67\,\text{ms}
物理引擎把每秒切成 60 个等长的小时间片,每个时间片只做一次完整的受力与碰撞计算,就像施工队每 16.67 毫秒对全城物体“点名检查”一次。
  1. 物理步长物理引擎把时间切成固定小步,每步重新计算物体受力与位置。
    Δt=160 s\Delta t = \frac{1}{60}\,\text{s}
  2. 帧预算分摊渲染一帧只有 16.67ms,物理要和渲染、逻辑共享这段时间。
    Tframe=Tphysics+Tlogic+TrenderT_{\text{frame}} = T_{\text{physics}} + T_{\text{logic}} + T_{\text{render}}
  3. 步长与成本步长越小模拟越稳,但每秒要算的步数越多,成本越高。
    Nsteps=f×tsimN_{\text{steps}} = f \times t_{\text{sim}}

刚体求解器:搬运调度组

施工队里最忙的是“搬运调度组”。工地上有大量刚体——不会形变的箱子、车身、墙体碎片。调度组的任务:让这些箱子在重力中下落、与地面接触、互相堆叠而不穿透、不抖动。游戏里几百个箱子叠罗汉的镜头,都要靠求解器在几毫秒内算完。

刚体运动分两步:积分(按速度更新位置)与约束求解(让接触点满足“不穿透、有摩擦”)。约束越多越难同时满足——比如一摞箱子每个接触点都要求不穿模,牵一发动全身。求解器于是用迭代法反复修正每个接触点的冲量。PhysX 使用 PGS(投影高斯-赛德尔)迭代冲量求解器,每个接触点按下面这个公式算出修正冲量,反复迭代 4~8 次收敛到“看起来自然”即可;Chaos 同样采用迭代式求解,但约束系统更通用,统一处理关节、碰撞与破坏后的新接触。

两个物体碰撞瞬间要施加的冲量大小,是物理引擎公式库里的“镇店之宝”:

简单说,调度组不追求“一次性算准”,而是快速多轮微调——像给歪斜的箱子堆轻轻推几下,直到大体稳住。老师傅和新锐队的推法不同,但目标是同一个:稳、快、不掉帧。

J=(1+e)(− vrel⋅n)m1−1+m2−1\displaystyle J = \frac{(1+e)\left(-\,\mathbf{v}_{rel}\cdot \mathbf{n}\right)}{m_1^{-1}+m_2^{-1}}
这个公式像“对撞瞬间的结算单”:两辆推车相撞,结算单根据接近速度、反弹系数和两车质量,算出应该互相推多少力,才能让它们既不穿过去、又弹得自然。
  1. 法向投影取两物体接触面法线方向上相对接近的速度分量——只看“扑面而来”的那部分。
    vrel⋅n\mathbf{v}_{rel}\cdot \mathbf{n}
  2. 恢复系数e 取 0~1,表示碰撞后反弹程度,钢珠接近 1,面团接近 0。
    e∈[0, 1]e \in [0,\,1]
  3. 等效质量两物体质量倒数之和,决定这对碰撞的“惯性大小”,轻箱子被弹飞,重卡车纹丝不动。
    m1−1+m2−1m_1^{-1}+m_2^{-1}
  4. 脉冲量算出冲量沿法线施加到两个物体上,并整体迭代 4~8 次让所有接触全局稳定。
    J=(1+e)(−vrel,n)m1−1+m2−1J = \frac{(1+e)(-v_{\text{rel},n})}{m_1^{-1}+m_2^{-1}}

碰撞检测:防碰雷达

搬运箱子的吊车要装“防碰雷达”:先远远扫一圈,发现可能相撞的箱子,再仔细量一下是否真碰上了。物理引擎的碰撞检测也分两步走——粗检测和精检测。粗检测(Broadphase)把所有物体罩上一个长方体包围盒(AABB),用排序扫描或包围盒树快速剔除“离得老远”的组合;精检测(Narrowphase)对留下的候选对用 GJK(算凸体间距离)或 SAT(分离轴定理)精确判断,得到接触点、法线和穿透深度。

碰撞检测有一个经典坑:“隧道效应”。子弹、薄板这类又小又快的物体,一帧里移动的距离可能超过自身厚度,前后两帧都没有接触记录,直接穿墙。解决办法是连续碰撞检测(CCD)——沿运动路径细分子步;或者干脆限制单帧最大位移。工程上把这个约束写成:

所以工程上要么给子弹限速,要么给薄物体开 CCD“特权通道”,在移动路径上连续采样。两支施工队的防碰雷达原理相通,差别在加速结构和容差调优。

Δx=v Δt≤smin⁡\displaystyle \Delta x = v\,\Delta t \le s_{\min}
雷达再先进也怕快:只要一帧跑得太远,任何检测都会漏报。这个公式提醒我们,物体的“单帧脚程”(速度×帧时间)不能超过它最薄处的尺寸,否则就会从墙里“瞬移”过去。
  1. 单帧位移物体在一帧内前进的距离由速度乘帧时间得到。
    Δx=v×Δt\Delta x = v \times \Delta t
  2. 最小包围尺寸取物体长宽高中的最小值作为“厚度”基准,薄板最怕穿透。
    smin⁡=min⁡(w,h,d)s_{\min} = \min(w, h, d)
  3. 穿透判断当单帧位移超过最薄尺寸时,探测器可能完全错过,即穿模。
    Δx>smin⁡⇒tunnel\Delta x > s_{\min} \Rightarrow \text{tunnel}

破坏体系统:拆迁爆破组

施工队里最吸引眼球的是“拆迁爆破组”:一面十几米长的墙要被炸成一地碎渣。如果真把墙切成几万块砖去实时模拟,任何 CPU 都扛不住。爆破组的思路是“先切成大块,坏到哪一步碎到哪一步”。Chaos 的破坏体系把 3D 网格转成“几何集合资产”(Geometry Collection),自动按 Voronoi 剖分或体素化切成碎块;碎块之间用“粘结”相连,只有受到足够冲击力、累计损伤超过阈值时,粘结才断开,生成真正独立的刚体碎片。

碎片还可以再“聚类”组合成大块——远处一撞掉大块,近处才细化到小块。配合 Fields 场(冲击波、爆炸力、风力)与 LOD 策略(远距离碎块合并或隐藏),大规模破坏才真正可行。《堡垒之夜》整岛碎裂,就是这种“分层破碎”的极致体现。碎块数量与切分尺寸的关系很直观:

爆破组的关键词是“分层”与“分级”——像摄影师先拍大景再拍特写,引擎先保证远处不卡,再为镜头前的碎块燃烧算力。

N=⌈Ws⌉×⌈Hs⌉×⌈Ds⌉\displaystyle N = \left\lceil \frac{W}{s} \right\rceil \times \left\lceil \frac{H}{s} \right\rceil \times \left\lceil \frac{D}{s} \right\rceil
就像给一块豆腐切网格:沿长、宽、高三方向各切几刀,切的刀数相乘就是豆腐块总数。刀越密块越多,下锅(计算)就越慢。
  1. 三向切片数沿长宽高三个方向按块尺寸向上取整得到每方向切几刀。
    ⌈Ws⌉×⌈Hs⌉\left\lceil \frac{W}{s} \right\rceil \times \left\lceil \frac{H}{s} \right\rceil
  2. 总碎块数三个方向切片数的乘积就是体素化碎块总数。
    N=nw×nh×ndN = n_w \times n_h \times n_d
  3. 成本控制块数越多计算量线性上升,必须用聚类与 LOD 把可见碎块压到预算内。
    N≤Nmax⁡N \le N_{\max}

GPU 加速:并联吊车

一个工人搬一百个箱子很慢,派一百个工人同时搬就快得多。GPU 就是拥有上千个小工人的“并联吊车集群”。但调用这堆工人需要指挥开销:数据要先打包送过去,算完还要搬回来。PhysX 是游戏物理界最早拥抱 GPU 的引擎之一:基于 CUDA 的刚体加速把成千上万个粒子、碎片的模拟摊给上千个流处理器,特别适合大量、同构、相互影响较小的场景;缺点是需要 NVIDIA 显卡,且 CPU 与 GPU 之间的数据拷贝会吃掉一部分收益。

Chaos 的策略更“克制”:刚体物理以 CPU 多线程为主,GPU 计算优先投入到 Niagara 粒子系统。UE5 的大规模破坏更多靠 CPU 多线程加聪明的 LOD 实现。为什么不能无脑加工人?因为任何任务里总有“必须一个人接着一个人干”的串行环节,它决定了加速的极限,这就是 Amdahl 定律:

并联吊车不是越多越好:串行的“指挥调度”无法并行,显卡总线带宽也有限。GPU 加速是“特定场景的利器”,不是万能钥匙。

S=1(1−P)+PNc\displaystyle S = \frac{1}{(1-P)+\frac{P}{N_c}}
吊车再多,也要有人统一指挥调度;指挥环节没法并行,最终提速永远到不了“工人数倍”。这就是 GPU 物理“看着美好、用着挑场景”的根本原因。
  1. 并行比例P 是可并行部分占整体时间的比例,P 越接近 1 越好。
    P∈(0, 1)P \in (0,\,1)
  2. 核心数加速把并行部分分给 N 个执行单元并行处理,理想情况下时间除以 N。
    PNc\frac{P}{N_c}
  3. 串行天花板当核心数趋近无穷,加速比的极限由串行部分 1-P 决定。
    lim⁡Nc→∞S=11−P\lim_{N_c \to \infty} S = \frac{1}{1-P}

Chaos 与 UE5:深度绑定

新锐队最独特的地方:总部直接设在甲方公司里。Chaos 是 Epic 为 UE5 从零写的物理后端,从网格导入、碎裂到渲染回读全程走自家流程,不需要第三方翻译官。架构上,Chaos 采用解耦的任务图设计:粗检测、精检测、约束求解、断裂事件被拆成可以按依赖关系调度的任务,多核 CPU 可以并行推进。

它自定义了“中间层”加速结构(对应 PhysX 的 Broadphase),把 AABB 与 BVH 混合使用,并统一约束接口,让关节、碰撞、破坏后的新接触共用一套求解器。在引擎集成层面,Geometry Collection 可以直接吃 Houdini 的 Voronoi 碎裂结果;Fields 场让策划在编辑器里拖一个冲击波就能驱动成片碎片飞出。整个模拟管线可以按阶段拆开看:

对 Epic 而言,与其长期租别人的施工队,不如把队伍养在自己楼下——调度、协同、定制都握在自己手里。这也是 UE5 开发者默认选择 Chaos 的根本原因。

tsim=tbroad+tnarrow+tsolve+tbreak\displaystyle t_{\text{sim}} = t_{\text{broad}} + t_{\text{narrow}} + t_{\text{solve}} + t_{\text{break}}
施工日志把一天拆成四段:先大范围扫雷(粗检测)、再精确量尺寸(精检测)、然后搬运归位(求解)、最后处理破裂重接(断裂)。每一段都能单独计时、单独优化。
  1. 粗检测耗时把包围盒对排序、剔除,快速缩小候选集合。
    tbroadt_{\text{broad}}
  2. 精检测耗时对候选对做形状级接触计算,产出触点、法线与深度。
    tnarrowt_{\text{narrow}}
  3. 求解与断裂迭代求解接触约束,并触发碎块生成与清除。
    tsolve+tbreakt_{\text{solve}} + t_{\text{break}}

工程实践:开工决策

回到你的虚拟城市项目:选哪支队伍?不是名气大就好,要看活的性质。要跨引擎、要对接 NVIDIA 生态(Isaac 机器人仿真、Omniverse),选 PhysX;只做 UE5、要大场面破坏,直接选 Chaos。无论选谁,开工前必须算“性能预算”:物理模拟通常占帧预算的 10%~20%。以 60fps 为例,一帧 16.67ms,物理只有 2~3ms 可花,超出预算的后果是掉帧、输入延迟和玩家投诉。

调试工具方面,PhysX 配 PVD(PhysX Visual Debugger)可视化查看碰撞体;Chaos 则用 UE5 内建可视化调试,直接显示碰撞形状、约束与应力。跨平台时,移动端应减少碎块数量、降低迭代次数;PC/主机可以更放开。预算公式很朴素:

工程选型很像装修选队伍:看口碑、看项目、看预算,最后还要看师傅会不会用。理解引擎差异的工程师,才能在物理世界里既做出漂亮场面,又不让帧率翻车。

Bphysics=Tframe×r,r∈[0.10, 0.20]\displaystyle B_{\text{physics}} = T_{\text{frame}} \times r,\quad r \in [0.10,\,0.20]
就像一个项目的“物理人工费”只能占总预算的一到两成:60fps 目标下,物理最多花掉 16.67ms 里的 1.7~3.3ms,花超了就得降级方案。
  1. 帧预算目标刷新率 60fps 时,一帧只有 16.67ms 可用。
    Tframe=160 sT_{\text{frame}} = \frac{1}{60}\,\text{s}
  2. 物理占比项目惯例把 10%~20% 的预算留给物理模拟。
    Bphysics=Tframe×0.15≈2.5 msB_{\text{physics}} = T_{\text{frame}} \times 0.15 \approx 2.5\,\text{ms}
  3. 超支降级预算超支时必须降低迭代次数、减少碎块或切换 LOD。
    overhead>0⇒degrade\text{overhead} > 0 \Rightarrow \text{degrade}

AI 应用场景

强化学习的“物理沙盘”

阶段:环境仿真

解决的问题:机器人与自动驾驶智能体需要海量试错数据,真机训练昂贵且危险。物理引擎提供低成本、可重置、可并行的虚拟环境,让智能体在近似真实的引力、摩擦、碰撞规则下学习。

具体案例:NVIDIA Isaac Sim 底层使用 PhysX,训练机械臂抓取物体——每个训练回合重置物体位置与姿态,智能体仅凭传感器反馈学习抓取力度;而在 UE5 环境仿真中,Chaos 则被用于生成可破坏障碍物,测试无人车对突发碎裂场景的避障策略。

程序化关卡的自检与 QA

阶段:自动化测试

解决的问题:AI 程序化生成海量墙体、塔楼等结构,人工逐个验证是否牢固成本极高。可以先用轻量物理模拟做“预检验”:生成的结构在脚本冲击下会不会倒、会不会碎,自动标记危险布局。

具体案例:关卡生成器产出一批脚手架构型后,测试脚本向关键结点施加爆破冲击,把结构送入 Chaos 模拟数秒,检测是否有碎块飞出预设安全区域,不合格的布局直接打回重生成。

破坏感知的 AI 决策

阶段:决策规划

解决的问题:射击游戏中墙体可破坏后,AI 原本“墙体=掩体”的导航假设不再可靠。需要把物理破坏信息喂给行为树或导航系统,让 AI 意识到掩体可能碎裂、路径可能被打通。

具体案例:在 UE5 项目中,AI 查询几何集合资产的“当前完整度”属性,若低于阈值则放弃该掩体并重新寻路;破坏瞬间把碎片位置同步给导航网格更新模块,实现“拆墙反击”的 NPC 行为。

Python 演示

python93 行
# -*- coding: utf-8 -*-"""2D 刚体脉冲求解与墙体碎裂演示:对应 PhysX/Chaos 的刚体求解与破坏体系统""" GRAVITY = 9.8RESTITUTION = 0.35DT = 0.02  class Brick:    def __init__(self, x, y, size=36):        self.x = x        self.y = y        self.size = size        self.mass = 1.0        self.vx = 0.0        self.vy = 0.0        self.alive = True        self.hit_count = 0     def apply_hit(self):        self.hit_count += 1        if self.hit_count >= 2:            self.alive = False  class Projectile:    def __init__(self, x, y, r=14):        self.x = x        self.y = y        self.r = r        self.mass = 3.0        self.vx = 42.0        self.vy = 0.0  def build_wall(cols=8, rows=4):    wall = []    for r in range(rows):        for c in range(cols):            wall.append(Brick(30 + c * 42, 90 + r * 38))    return wall  def solve_impulse(ball, brick):    """两圆近似碰撞:沿法向施加脉冲,对应碰撞脉冲公式"""    if not brick.alive:        return    dx = ball.x - brick.x    dy = ball.y - brick.y    dist = (dx * dx + dy * dy) ** 0.5    bound = ball.r + brick.size * 0.5    if dist >= bound or dist < 1e-9:        return    nx, ny = dx / dist, dy / dist    rel_n = (ball.vx - brick.vx) * nx + (ball.vy - brick.vy) * ny    if rel_n >= 0:        return    j = (1 + RESTITUTION) * (-rel_n) / (1.0 / ball.mass + 1.0 / brick.mass)    ball.vx += -j * nx / ball.mass    ball.vy += -j * ny / ball.mass    brick.vx += j * nx / brick.mass    brick.vy += j * ny / brick.mass    brick.apply_hit()  def simulate(wall, ball, steps=500):    for _ in range(steps):        ball.vy += GRAVITY * DT        ball.x += ball.vx * DT        ball.y += ball.vy * DT        if ball.y + ball.r >= 300:            ball.y = 300 - ball.r            ball.vy *= -0.4        for b in wall:            solve_impulse(ball, b)            if not b.alive:                b.vy += GRAVITY * DT                b.y += b.vy * DT                if b.y + b.size * 0.5 >= 300:                    b.y = 300 - b.size * 0.5                    b.vy = 0.0  def main():    wall = build_wall()    ball = Projectile(40, 200)    simulate(wall, ball)    alive = sum(1 for b in wall if b.alive)    print("剩余未破坏砖块: %d / %d" % (alive, len(wall)))  if __name__ == "__main__":    main()
目的:用 80 行 Python 复刻 PhysX/Chaos 的核心思想——碰撞脉冲公式解决“不穿透”,受击累计损伤解决“破坏系统”,跑一遍就能看到 32 块墙砖被弹丸击碎的过程。
  1. class Brick:每块墙砖就是一个刚体,拥有位置、速度、质量与存活状态。
  2. def solve_impulse(ball, brick):碰撞脉冲求解器,对应正文中的接触冲量公式。
  3. j = (1 + RESTITUTION) * (-rel_n) / (1.0 / ball.mass + 1.0 / brick.mass)直接实现脉冲公式:恢复系数缩放接近速度,再除以等效质量倒数之和。
  4. brick.apply_hit()每次碰撞给砖块累计一次损伤,被打中两次就“断开粘结”成为碎片。
  5. if b.y + b.size * 0.5 >= 300:简单地面碰撞,让碎片落地后停下,避免无限下落。

常见误区

误区“UE5 里默认是 Chaos,PhysX 已经是淘汰货了,无脑用 Chaos 就完事了。”

正解两支队伍各有擅长:PhysX 生态成熟、跨引擎通用、文档丰富,还支持 CUDA 刚体加速;Chaos 的优势在 UE5 原生集成与大规模破坏。脱离项目谈“谁吊打谁”没有意义。老项目、需要跨引擎移植、或对接 NVIDIA 仿真生态时,PhysX 仍是合理选择。

为何常见:人们容易把“新默认”误解为“全面优胜”,忽略了引擎选型本质上是成本、平台、团队经验的综合权衡。

误区“显卡那么多核心,开了 GPU 物理肯定翻倍提速。”

正解GPU 加速只在大量同构刚体、高并行度的场景(几千个碎片、粒子)中占优;它要付数据上传下载的开销,还要和渲染抢资源,且依赖特定显卡。Chaos 把刚体放在 CPU 多线程上,配合 LOD 一样能跑出整岛碎裂。Amdahl 定律告诉我们,串行部分的占比永远卡着加速比的上限。

为何常见:广告和 Demo 总是展示最有利的场景,让小白误以为 GPU 是万能加速器。

误区“真实感 = 碎块数,模型切得越碎越真实。”

正解碎块每多一块,就多一个刚体要计算。Chaos 的破坏体系是“分层破碎”:远处掉大块、近处方细化,配合 LOD 在距离远时合并或隐藏碎块。把每粒沙子都模拟出来,画面反而抖动、掉帧、体验更差。好的破坏是“镜头前的艺术”,不是“数学上的真实”。

为何常见:追求极致细节是初学者的本能,但游戏物理的第一目标是稳定和帧率,其次才是真实。

误区“引擎一定是拿完整三角面逐个对比两个模型,重叠就算碰撞。”

正解全尺寸三角形精确碰撞代价极高,游戏里普遍先用包围盒做粗检测剔除远距对,再用 GJK/SAT 对凸包做精检测。碰撞体通常是胶囊体、盒子等简化形状。另外,又薄又快的物体需要 CCD 防止隧道效应,否则照样穿模。碰撞检测是一门“先粗筛、再精算、最后补漏”的工程艺术。

为何常见:人脑理解“碰撞”很直观,容易忽略引擎为了实时性做的各种近似与加速结构。

误区“物理引擎就像仿真软件,解出来的都是精确牛顿力学结果。”

正解游戏物理是“足够好用”的工程近似:迭代只做 4~8 次、碰撞体用简化形状、穿透允许小范围容差。它追求的是“看起来自然、跑起来稳定、不掉帧”,而不是学术级精确。物理引擎更像是熟练的积木工,知道怎么搭又快又稳,而不是力学教授手算每块砖的应力。

为何常见:“物理引擎”这个名字自带“精确”光环,让人忽略了实时渲染行业一贯的取舍哲学。

面试题

Q1. 以下哪家公司是 PhysX 引擎的持有方?

单选题 · easy

  • A.Epic 公司
  • B.英伟达公司← 正确答案
  • C.微软公司
  • D.索尼公司

答案:B。PhysX 前身来自 Ageia,2008 年被 NVIDIA 收购,因此持有方是英伟达。Epic 是 Chaos 的持有方,微软与索尼与 PhysX 没有归属关系。记住“老师傅 PhysX 归英伟达,新锐 Chaos 归 Epic”这对搭档就不会混。

Q2. UE5 中默认使用的物理引擎是哪一个?

单选题 · easy

  • A.PhysX 引擎
  • B.Havok 引擎
  • C.Chaos 引擎← 正确答案
  • D.Bullet 引擎

答案:C。UE5 将 Epic 自研的 Chaos 设为默认物理后端,PhysX 在 UE4 时代是默认,UE5 中已被替代。Havok 多用于其他商业引擎,Bullet 是开源引擎。可以记成“新锐队把总部搬进 UE5 后,老师傅就退居二线了”。

Q3. 刚体碰撞脉冲公式中的 e 代表什么物理量?

单选题 · mid

  • A.接触面摩擦系数
  • B.碰撞恢复系数← 正确答案
  • C.物体质量大小
  • D.法向穿透深度

答案:B。e 是恢复系数,取值范围 0~1,描述碰撞后反弹程度:钢珠接近 1,面团接近 0。摩擦系数、质量、穿透深度都由其他参数描述。公式中 e 只与“弹不弹”有关。

Q4. 破坏体系统通常先把大网格切分成什么再模拟碎裂?

单选题 · mid

  • A.三角形面片集
  • B.体素化碎块集← 正确答案
  • C.骨骼绑定层级
  • D.材质贴图通道

答案:B。Chaos 等破坏系统把网格按 Voronoi 剖分或体素化切成碎块集合(几何集合资产),碎块间用粘结相连,受力超过阈值才断开。三角形面片只是渲染单位,骨骼绑定是动画概念,材质通道与碎裂无关。

Q5. 关于 Chaos 引擎的说法,正确的有哪些?

多选题 · mid

  • A.由 Epic 公司研发← 正确答案
  • B.与 UE5 深度融合← 正确答案
  • C.刚体必须 GPU 运行
  • D.擅长大规模破坏← 正确答案

答案:ABD。Chaos 是 Epic 自研、深度集成于 UE5 的物理引擎,以 CPU 多线程为主、擅长大规模破坏(代表作是《堡垒之夜》整岛碎裂)。C 错误:Chaos 刚体并不依赖 GPU 才能运行。

Q6. PhysX 的 GPU 刚体加速依赖于哪项技术?

单选题 · hard

  • A.CUDA 并行计算← 正确答案
  • B.光线追踪硬件
  • C.通用 OpenCL
  • D.纯 CPU 指令集

答案:A。PhysX 的 GPU 刚体加速基于 NVIDIA 的 CUDA 架构,需要 N 卡支持。光线追踪硬件与刚体模拟无关,OpenCL 历史上并未成为 PhysX 主流方案,纯 CPU 指令集则是无 GPU 时的退路。

Q7. 高速飞行的子弹容易“穿墙”,最主要的原因是什么?

单选题 · mid

  • A.墙体材料刚度不足
  • B.单帧位移过大漏检← 正确答案
  • C.子弹质量设置过小
  • D.碰撞体形状过小

答案:B。隧道效应源于物体单帧位移超过自身厚度,前后两帧都没有采样到接触点,检测直接漏报。解法是 CCD 或限速。材料刚度、质量、形状都不是“穿墙”的根本原因。

Q8. 刚体求解器普遍采用迭代法(如 PGS)的原因有哪些?

多选题 · hard

  • A.实时场景难以求解析解← 正确答案
  • B.迭代可权衡精度与性能← 正确答案
  • C.迭代一定比解析更精准
  • D.约束数量多且要求实时← 正确答案

答案:ABD。游戏场景约束成百上千,精确解析求解开销极大且不稳定,迭代法用 4~8 次循环在精度与帧耗时之间取平衡,满足实时要求。C 错误:迭代只是近似收敛,精度上限通常低于解析解。

Q9. 下列哪一项属于物理引擎的“粗检测”阶段?

单选题 · easy

  • A.包围盒初筛阶段← 正确答案
  • B.GJK 距离计算
  • C.接触法向求解
  • D.摩擦锥投影计算

答案:A。粗检测(Broadphase)用 AABB 包围盒快速剔除远距物体对;GJK、接触法向、摩擦锥都属于精检测或求解阶段。可以类比“先大范围扫雷,再精细量尺寸”。

Q10. 关于 Chaos 破坏效果的正确说法有哪些?

多选题 · hard

  • A.基于几何集合资产← 正确答案
  • B.依靠场驱动碎片受力← 正确答案
  • C.远距碎块自动降低精度← 正确答案
  • D.碎块生成后无需管理

答案:ABC。Chaos 破坏以 Geometry Collection 为资产基础,用 Fields 场(冲击波、风力)驱动碎片,并通过聚类与 LOD 让远处碎块降精度。D 错误:碎块越多成本越高,必须靠聚类、合并与回收机制持续管理。