第五篇:物理模块解剖课 - 刚体/碰撞体/关节的隐秘特性
为什么你的角色总在"鬼畜旋转"?
引言:物理模块的暗黑面
你是否遭遇过这些诡异现象?
- 角色倒地后像陀螺般疯狂自旋
- 看似对称的物体却总偏向一侧滚动
- 关节约束的物体莫名颤抖甚至解体
这些问题的根源,往往隐藏在物理模块的隐秘参数中。本文将揭开刚体、碰撞体、关节系统的层层面纱。
一、刚体系统:质量分布的陷阱
Rigidbody远不止是质量(Mass)的容器:
-
质心(Center of Mass)的阴谋
- 默认质心位于碰撞体几何中心,可能不符合视觉预期
- 手动修正方案:
// 通过空物体标记视觉质心 public Transform visualCenterOfMass; void Start() { rb.centerOfMass = visualCenterOfMass.localPosition; }
- 调试技巧:在Scene视图开启
Rigidbody Info
显示质心位置
-
惯性张量(Inertia Tensor)的魔力
- 物理意义:物体抵抗旋转的难易程度(各向异性)
- 经典案例:
// 让物体更容易绕Y轴旋转(如旋转门) rb.inertiaTensor = new Vector3(2, 0.5f, 2);
- 自动化调整:
rb.ResetInertiaTensor(); // 根据碰撞体重算惯性张量
-
冻结约束的副作用
- 冻结旋转轴可能导致能量异常累积
- 正确做法:
// 优先使用物理约束而非完全冻结 rb.angularDrag = 5; // 增加旋转阻力
二、碰撞体系统:形状的性能博弈
不同Collider类型的性能差异可达10倍以上:
-
基础形状性能天梯
碰撞体类型 CPU开销 适用场景 Sphere ★☆☆☆☆ 子弹/抛射物 Capsule ★★☆☆☆ 角色控制器 Box ★★★☆☆ 场景道具 Mesh ★★★★★ 静态复杂地形(慎用) -
MeshCollider的救赎之路
- 凸包模式:勾选
Convex
后性能提升5倍 - 简化策略:
- 使用
Mesh Simplifier
插件减少面数 - 用多个简单Collider拼合复杂形状
- 使用
- 致命误区:
// 错误:动态物体使用非凸MeshCollider void Start() { gameObject.AddComponent<MeshCollider>(); // 未勾选Convex! }
- 凸包模式:勾选
三、关节系统:稳定的艺术
关节的抖动问题,90%源于参数误配:
-
关节类型选型指南
关节类型 自由度 典型应用场景 Hinge Joint 1 门/旋转陷阱 Fixed Joint 0 物体粘合 Spring Joint 6 悬挂系统/弹性连接 Configurable 6 自定义机械结构 -
稳定性调参三要素
- 投影(Projection):
joint.projectionMode = JointProjectionMode.PositionAndRotation; joint.projectionDistance = 0.1f;
- 阻尼(Dampening):
joint.angularYZDrive = new JointDrive { positionSpring = 100, positionDamper = 10, // 关键稳定参数 maximumForce = 1000 };
- 容差(Tolerance):
joint.breakForce = Mathf.Infinity; // 禁用自动断开
- 投影(Projection):
四、物理材质:被忽视的能量杀手
Physic Material的微妙设定可能毁掉整个物理系统:
-
摩擦模型解密
- 各向异性摩擦:
physicMaterial.frictionDirection2 = Vector2.right; // 设置优先方向 physicMaterial.dynamicFriction2 = 0.2f;
- 组合摩擦公式:
F_{friction} = \mu_{static} \cdot F_{normal} \quad (\text{静摩擦}) F_{friction} = \mu_{dynamic} \cdot F_{normal} \quad (\text{动摩擦})
- 各向异性摩擦:
-
弹性陷阱
- 能量守恒误区:
physicMaterial.bounciness = 1; // 理想弹性碰撞(实际会因数值误差持续加速)
- 正确做法:
physicMaterial.bounciness = 0.8f; physicMaterial.bounceCombine = PhysicMaterialCombine.Minimum; // 取两者较小值
- 能量守恒误区:
五、模块联调实战
通过复合案例融会贯通:
案例:失控的机甲战士
-
现象:
- 机甲四肢关节随机抖动
- 移动时整体旋转失控
-
诊断步骤:
- 检查质心位置是否偏移
- 确认所有动态物体未使用非凸MeshCollider
- 调整关节的Projection和Dampening参数
- 为足部添加物理材质降低摩擦
-
关键代码:
// 稳定腿部关节 foreach(var joint in legJoints) { joint.projectionMode = JointProjectionMode.PositionAndRotation; joint.projectionDistance = 0.05f; joint.angularDrive = new JointDrive { positionSpring = 200, positionDamper = 20 // 抑制抖动 }; }
结语:从参数奴隶到物理主宰
掌握这些隐秘特性,就能让物理系统从"不可控的玄学"变为"精准的工具"。
在下一章《性能屠龙技 - 从PC到移动端的优化全链路》中,我们将解锁:
- 物理计算耗时的Profiling技巧
- 移动端物理的"瘦身"秘籍
- 大规模场景的优化核武器
思考题:
当需要实现一个可击碎的玻璃窗时,最优Collider方案是:
A. 使用精确的MeshCollider
B. 用多个BoxCollider拼合
C. 使用Convex MeshCollider
D. 采用粒子系统替代
(答案:B。用简单碰撞体组合在保证效果的同时性能最优)
下篇预告:揭秘移动端物理优化的"降维打击"策略,让低端机也能流畅运行物理特效!