<pc-collision>
<pc-collision> 为实体定义碰撞形状。配合 <pc-rigid-body> 时参与物理模拟,单独使用时则为报告进入事件的触发体积。
用法
- 必须直接位于
<pc-entity>、<pc-model>或<pc-node>下。
属性
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
angular-offset | Vector3 | "0 0 0" | 相对实体旋转,按 X Y Z 角度制欧拉角指定 |
axis | Number(数字) | "1" | 圆柱、胶囊和圆锥的轴,0=X、1=Y、2=Z |
convex-hull | Boolean(布尔) | "false" | 网格碰撞是否使用凸包 |
enabled | Boolean(布尔) | "true" | 组件启用状态 |
half-extents | Vector3 | "0.5 0.5 0.5" | 盒体 X Y Z 半尺寸 |
height | Number(数字) | "2" | 圆柱、胶囊和圆锥高度 |
linear-offset | Vector3 | "0 0 0" | 相对实体的 X Y Z 位置偏移 |
radius | Number(数字) | "0.5" | 球、圆柱、胶囊和圆锥半径 |
type | Enum(枚举) | "box" | "box" | "capsule" | "compound" | "cone" | "cylinder" | "mesh" | "sphere"。compound 合并后代碰撞形状 |
除 mesh 外的形状忽略实体缩放,应通过 half-extents、radius 和 height 调整。默认尺寸也不总匹配渲染图元,例如 pc-render 圆柱和圆锥高 1,而碰撞形状默认高 2。
网格碰撞体
网格需要几何数据,但没有直接提供资源的属性。type="mesh" 会使用实体加载时的 Render 组件,适合绑定到 GLB 内的 <pc-node>:
<pc-model asset="car">
<pc-node name="Body">
<pc-collision type="mesh"></pc-collision>
<pc-rigid-body type="static"></pc-rigid-body>
</pc-node>
</pc-model>
精确三角网格仅支持静态刚体。运动刚体应启用 convex-hull,使用凸包。
组件每次应用时重新解析几何体,因此 pc-node 重定向或重新绑定后会采用新节点网格。
Render 必须有渲染资源支持,pc-render 基本图元没有资源,不能用作此类来源,应改用匹配的基本碰撞形状。没有合适 Render 时会警告,碰撞体没有形状。
示例
球体、胶囊体和盒体使用匹配的碰撞形状,落到静态地面。修改球 radius,视觉网格不变,但碰撞行为会改变:
<pc-app>
<!-- Physics requires the ammo.js WebAssembly module -->
<pc-wasm name="Ammo" glue="https://developer.playcanvas.com/assets/modules/ammo/ammo.wasm.js" wasm="https://developer.playcanvas.com/assets/modules/ammo/ammo.wasm.wasm" fallback="https://developer.playcanvas.com/assets/modules/ammo/ammo.js"></pc-wasm>
<pc-scene>
<pc-entity name="camera" position="0 2 8">
<pc-camera clear-color="#1d1f2b"></pc-camera>
</pc-entity>
<pc-entity name="light" rotation="45 30 0">
<pc-light cast-shadows normal-offset-bias="0.05" shadow-bias="0.2"></pc-light>
</pc-entity>
<pc-entity name="ball" position="-1.5 4 0">
<pc-render type="sphere"></pc-render>
<pc-collision type="sphere" radius="0.5"></pc-collision>
<pc-rigid-body type="dynamic"></pc-rigid-body>
</pc-entity>
<pc-entity name="pill" position="0 5 0" rotation="0 0 70">
<pc-render type="capsule"></pc-render>
<pc-collision type="capsule" radius="0.5" height="2"></pc-collision>
<pc-rigid-body type="dynamic"></pc-rigid-body>
</pc-entity>
<pc-entity name="crate" position="1.5 6 0" rotation="20 30 40">
<pc-render type="box"></pc-render>
<pc-collision type="box" half-extents="0.5 0.5 0.5"></pc-collision>
<pc-rigid-body type="dynamic"></pc-rigid-body>
</pc-entity>
<pc-entity name="ground" position="0 -0.5 0" scale="12 1 12">
<pc-render type="box"></pc-render>
<pc-collision half-extents="6 0.5 6"></pc-collision>
<pc-rigid-body type="static"></pc-rigid-body>
</pc-entity>
</pc-scene>
</pc-app>
JavaScript 接口
可以通过 CollisionComponentElement API创建和操作元素。
component 是底层 CollisionComponent,就绪前为 null,其余功能可通过它访问。
另请参阅
<pc-rigid-body>:让形状参与物理。<pc-joint>:约束两个刚体。<pc-wasm>:加载 Ammo。