公司动态

Mesh Collider 勾选 Convex 背后的逻辑变更:从“逐三角形“到“凸多面体“的质变

📅 2026/8/18 13:29:13
Mesh Collider 勾选 Convex 背后的逻辑变更:从“逐三角形“到“凸多面体“的质变
开场一个勾了个选项碰撞就正常了的疑惑小王给一个复杂模型加了 Mesh Collider想让它能被推动结果报错说非凸网格不能做动态刚体。勾上 Convex一切正常了但性能也好了很多。“为啥勾一个Convex凸包选项不仅能做刚体了性能还变好了这背后到底改变了什么逻辑凸包’是啥意思勾了之后碰撞检测怎么就不一样了”老鸟说“这个勾选背后是碰撞检测算法的根本性变更从’逐三角形精确检测’变成了’凸多面体检测’——计算方式完全不同这就是为什么又快又能做刚体今天把这个’质变’讲透” 第一幕先理解凸和凹凸(Convex) vs 凹(Concave)凸(Convex)形状 任意两点连线,都在形状内部 → 没有凹陷 → 如: 球、立方体、胶囊、任何鼓起来的 ↓ 凹(Concave)形状 有凹陷部分 → 如: 碗、字母L、月牙、有洞的模型图示理解凸(Convex): 凹(Concave): ⬤ 球 月牙(有凹) ⬜ 方块 碗(有凹陷) ▲ 三角 L 形(有拐) ↓ ↓ 连线都在内部 连线会跑到外面生动理解凸凹凸像鼓起的气球,凹像瘪下的碗 凸: 表面处处向外鼓 → 拿橡皮筋套住,贴合表面 凹: 有向内陷的地方 → 橡皮筋套住,会架空凹陷处 ↓ 凸包就是橡皮筋套住的那个鼓形状! 第二幕Convex 做了什么——生成凸包⭐勾选 Convex 的本质变更不勾Convex(默认): 碰撞体 模型的原始网格 → 保留所有三角形细节 → 可能是凹的、复杂的 勾选Convex: 碰撞体 模型的凸包(Convex Hull) → 生成一个包裹住模型的凸壳 → 简化成一个凸多面体! ↓ 本质: 把复杂网格 → 简化成凸壳!凸包是什么凸包(Convex Hull) 能包裹住所有顶点的 最小凸多面体 ↓ 想象: 用一层保鲜膜紧紧裹住模型 → 凹陷处被膜架空跨过 → 得到的外壳就是凸包!图示凸包生成原始模型(凹,复杂): 凸包(Convex): ╱╲__╱╲ ╱‾‾‾‾╲ ╱ ╲ → ╱ ╲ (有凹陷细节) (凹陷被填平,凸壳) ↓ ↓ 逐三角形复杂 简化的凸多面体生动理解凸包生成生成凸包像给模型套保鲜膜 复杂的凹模型 → 套上紧绷的保鲜膜 → 凹陷处膜架空跨过 → 得到光滑的凸外壳 ↓ 碰撞检测就用这个外壳! → 不管里面多复杂! 第三幕为什么凸包检测更快⭐碰撞算法的根本不同凹网格(不勾Convex)的碰撞检测 → 要逐个三角形检测 → 成百上千个三角形逐一判断 → 算法复杂、慢! 凸多面体(勾Convex)的碰撞检测 → 有专门的高效算法! → 如GJK、SAT等凸体算法 → 利用凸性质快速判断 ↓ 凸体检测有数学捷径,凹的没有!凸性质带来的捷径凸形状的数学特性 → 可以用分离轴等方法快速判断 → 一旦找到一个分离面就确定不碰 → 不用逐三角形穷举! ↓ 这就是凸体算法快的根源! ↓ 凹形状没这性质 → 只能老实逐三角形查!生动理解快的原因凸vs凹检测像判断形状相交 凸形状: 像判断两个规整积木 → 有巧妙的数学方法秒判! 凹形状: 像判断两团揉皱的纸 → 只能一点点比对每个褶皱(慢)! ↓ 凸的有捷径,凹的只能硬查! 第四幕为什么凸包才能做动态刚体⭐关键限制⚠️ Unity规则 非凸(Concave)的Mesh Collider → 不能做动态刚体! → 只能做静态(不加Rigidbody) ↓ 想让Mesh Collider物体 受物理、能运动、被推动 → 必须勾Convex!为什么凹的不能动态凹形状做动态刚体的难题 ① 凹形状碰撞检测本就慢 → 动态物体每帧都检测 → 太贵! ② 凹形状的碰撞响应复杂 → 凹陷处的碰撞力难以稳定计算 → 容易出错、穿透、抖动! ↓ 所以Unity限制: 动态刚体必须用凸形状(简单稳定)!生动理解动态限制凹形状做动态像揉皱的纸做的球 想让它滚动、碰撞、被推: → 皱褶处怎么受力?怎么弹? → 引擎算不清、不稳定! ↓ 凸形状(光滑外壳)做动态: → 受力清晰、碰撞稳定! ↓ 所以动态必须凸! 第五幕勾 Convex 前后的完整对比全方位对比不勾Convex 勾Convex 碰撞体形状 原始网格 凸包(凸壳) 精度 精确(含凹陷) 近似(填平凹陷) 检测速度 慢(逐三角形) 快(凸体算法)⭐ 能否动态刚体 不能 能!⭐ CPU开销 高 低 适用 静态精确碰撞 动态/性能优先精度的代价⚠️ 勾Convex的代价: 丢失凹陷细节! 比如一个碗模型: 不勾: 能检测到碗内部的凹陷 (球能掉进碗里) 勾Convex: 凹陷被填平 (球会停在碗口上,进不去!) ↓ 凸包 用精度换性能和动态能力!生动理解权衡勾Convex像用外壳代替精雕: 精雕(凹网格): 精确但慢、不能动 外壳(凸包): 粗略但快、能动 ↓ 按需选择: 需要精确凹陷 → 不勾(但只能静态) 需要动态/性能 → 勾Convex(接受近似)️ 第六幕实战建议建议1动态物体必勾 Convex✅ 需要物理运动的Mesh Collider: → 必须勾Convex(否则不能动态刚体) ↓ 或者更好: 用简单碰撞体(球/盒/胶囊) → 比凸包还快!建议2静态复杂碰撞可不勾✅ 静态的、需要精确凹陷的: (如地形、复杂建筑内部) → 可以不勾(保留精度) → 但不加Rigidbody(保持静态) ↓ 静态凹网格性能可接受(不用每帧动态检测)建议3凸包也可能不够⚠️ 复杂凹模型即使能拆: → 可用多个凸碰撞体拼接 → 逼近原始凹形状 ↓ 如: 一个L形用两个盒子拼 → 比凸包精确,比凹网格快!建议4优先用基础碰撞体✅ 性能优先级: 基础碰撞体(球/盒/胶囊) 凸包Mesh Collider 凹网格Mesh Collider ↓ 能用基础的就别用Mesh Collider!生动理解实战实战选择像选合适的鞋: 日常跑步(动态物体) → 运动鞋(凸包/基础体) 陈列展示(静态精确) → 精致皮鞋(凹网格可以) 复杂需求 → 多双搭配(多凸体拼接) ↓ 按场景选最合适的!✅ Convex 逻辑变更理解检查清单凸凹概念 □ 明白凸(无凹陷)vs凹(有凹陷)⭐ □ 明白凸包是包裹的凸外壳 逻辑变更 □ 明白勾Convex网格变成凸包⭐ □ 明白检测从逐三角形变凸体算法 □ 明白凸体算法有数学捷径(快) 动态限制 □ 明白凹网格不能做动态刚体⭐ □ 明白为什么(慢不稳定) 代价 □ 明白凸包丢失凹陷细节(精度换性能) □ 明白碗填平后球进不去 实战 □ 动态物体勾Convex或用基础体 □ 静态精确可不勾 □ 优先用基础碰撞体 □ 知道多凸体拼接逼近凹形状 一句话总结Mesh Collider 勾选 Convex 背后的逻辑变更核心变更是——碰撞体的形状和检测算法都发生了根本改变。① 形状变更不勾时碰撞体是模型的原始网格保留所有三角形和凹陷细节勾选后碰撞体变成模型的凸包Convex Hull——就像给模型套一层紧绷的保鲜膜凹陷处被膜架空跨过得到一个简化的凸外壳。② 算法变更凹网格只能逐三角形检测成百上千个三角形逐一判断慢凸多面体可以用专门的高效凸体算法如 GJK、SAT利用凸的数学性质走捷径快速判断——这就是勾了之后性能变好的根源。③ 动态能力变更非凸网格不能做动态刚体因为凹形状检测慢、碰撞响应不稳定、易穿透抖动而凸包因为形状简单稳定才能做受物理控制、能运动的动态刚体——这就是为什么勾了才能加 Rigidbody。代价凸包填平了凹陷细节比如碗模型勾 Convex 后凹陷被填平球会停在碗口进不去——这是用精度换性能和动态能力。实战动态物体必须勾 Convex或更好地用球/盒/胶囊基础碰撞体比凸包还快静态需要精确凹陷的可以不勾但保持静态复杂凹形状可用多个凸碰撞体拼接逼近。核心口诀勾Convex把原始网格变成凸包外壳检测从逐三角形变凸体算法有捷径所以快凹网格不能动态刚体凸包才能因为简单稳定代价是填平凹陷精度换性能动态用凸包或基础体静态精确可不勾 Convex 逻辑变更速查表维度不勾Convex勾Convex碰撞形状原始网格凸包外壳⭐检测算法逐三角形(慢)凸体算法(快)⭐动态刚体不能能!⭐精度精确(含凹陷)近似(填平凹陷)CPU开销高低适用静态精确动态/性能 一句话记住核心勾 Convex 把原始网格变成凸包外壳套保鲜膜填平凹陷。检测算法从逐三角形慢“变成凸体算法有数学捷径快”且因形状简单稳定才能做动态刚体。代价是丢失凹陷细节——动态物体必勾或用基础体静态精确可不勾 延伸碰撞体选择的完整逻辑【Convex只是碰撞体选择的一环】 碰撞体从快到慢、简单到复杂 ① 基础碰撞体(最优): Sphere球 Capsule胶囊 Box盒 → 数学公式直接算,最快! ② 凸包Mesh Collider(Convex): ← 本篇 → 凸体算法,较快,能动态 ③ 多凸体拼接(Compound): → 几个凸体组合,逼近复杂形状 → 平衡精度和性能 ④ 凹网格Mesh Collider(最贵): → 逐三角形,最慢,只能静态 ↓ 选择原则: 能用简单的绝不用复杂的 动态必须凸,静态才可凹 ↓ 理解Convex → 理解整个碰撞体优化体系!