跳到主要内容

<pc-collision>

<pc-collision> 为实体定义碰撞形状。配合 <pc-rigid-body> 时参与物理模拟,单独使用时则为报告进入事件的触发体积。

用法

属性​

属性类型默认值说明
angular-offsetVector3"0 0 0"相对实体旋转,按 X Y Z 角度制欧拉角指定
axisNumber(数字)"1"圆柱、胶囊和圆锥的轴,0=X、1=Y、2=Z
convex-hullBoolean(布尔)"false"网格碰撞是否使用凸包
enabledBoolean(布尔)"true"组件启用状态
half-extentsVector3"0.5 0.5 0.5"盒体 X Y Z 半尺寸
heightNumber(数字)"2"圆柱、胶囊和圆锥高度
linear-offsetVector3"0 0 0"相对实体的 X Y Z 位置偏移
radiusNumber(数字)"0.5"球、圆柱、胶囊和圆锥半径
typeEnum(枚举)"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,其余功能可通过它访问。

另请参阅​

示例:基础物理、物理簇和布娃娃。