跳到主要内容

<pc-node>

<pc-node> 绑定 <pc-model> 实例化树内的节点,声明覆盖值,无需改 GLB 即可隐藏、移动、添加组件或挂接内容。

pc-entity 创建实体,pc-node 则引用模型已创建的实体。name 用于查找,绝非重命名。

隐藏、姿态、换材质和挂接的完整案例详见调整模型。

用法
  • 必须位于 <pc-model> 内,可直接或嵌套于另一个 pc-node。
  • 可包含多个 pc-node,名称仅在当前绑定节点子树内解析。
  • 可包含多个 <pc-entity>,创建为绑定节点子项,充当挂点。
  • 支持与实体相同的组件,包括碰撞、灯光、脚本等。节点已有同类型时不重复添加,例如网格已有 Render,再加 pc-render 会警告且不操作。

属性​

属性类型默认值说明
enabledBoolean(布尔)原始值覆盖启用状态
indexNumber(数字)-同名匹配中按深度优先的零基索引,有歧义时必需,否则可省略
material-overridesString(字符串)原始值JSON 将选择器映射到 pc-material id,覆盖 Render 材质,详见覆盖材质
nameString(字符串)-在所属模型或外层节点范围内查找的名称
positionVector3原始值局部位置 X Y Z
rotationVector3原始值局部角度制欧拉角 X Y Z
scaleVector3原始值局部缩放 X Y Z
tagsString(字符串)原始值逗号分隔标签,替换原列表
恢复模型原始值

除 name 和 index 外均为覆盖。存在时替换原始值,缺省不改变;运行时移除,或将对应 property 设为 null,会恢复模型原值,而非引擎默认,因此表中没有固定默认。

覆盖不是叠加,position="0 1 0" 将局部 Y 直接设为 1,与导出值无关。

查找节点​

name 匹配加载后名称,需要在范围内唯一。嵌套节点将内层查询限制在外层子树,适合局部唯一名称。

同名不唯一时不绑定,并警告所有候选路径,使用 index 选择:

pc-node 'Wheel' is ambiguous in model 'car' - specify index: [0] Body/Wheel_FL/Wheel, [1] Body/Wheel_FR/Wheel

这是刻意行为,避免静默改错节点,以及重新导出新增同名后破坏原文档。

名称无匹配、索引越界或节点已被另一个 pc-node 绑定,也会警告且永不就绪。名称两次编辑距离内有候选时还会建议,便于发现拼写错误。

成功绑定后才就绪,后代也随之等待。模型重载或修改 name 重定向时,重新解析并将覆盖、组件和挂接内容应用到新节点。

覆盖材质​

material-overrides 以 JSON 将选择器映射到 <pc-material> id。外层应使用单引号,因为 JSON 内部需要双引号:

<pc-model asset="car">
<pc-node name="Body" material-overrides='{"name:CarPaint": "candy-red", "index:3": "smoked-glass"}'></pc-node>
</pc-model>

两种选择器都作用于绑定节点 Render 的网格实例:

选择器目标
name:X所有材质名为 X 的实例
index:NRender 列表中从 0 开始的第 N 个实例

映射为稀疏覆盖,无规则匹配则保留原材质。两类同时命中时 index 优先,因此可按名统一替换,再按索引指定例外。

通过模型 hierarchy()查看名称和索引。名称可重复,Untitled、defaultGlbMaterial 及 -flatShaded 副本均不保证唯一,不明确时使用 index。

名称按首次应用映射时捕获的原始分配匹配,不会匹配其他规则刚替换的材质,之后重命名也不改变目标。移除属性、property 设 null 或空对象都会恢复捕获的分配。

只针对模型原有 Render。绑定到没有 Render 的分组节点会警告,不操作;子 pc-render 新增的组件不是覆盖目标。

规则逐项验证,无效项警告并忽略,其余继续。包括无前缀、index 非非负整数、索引越界、名称无匹配,以及材质 id 无匹配。整体不是 JSON 对象,例如格式错误或数组,则视为缺省并恢复原分配,不保留旧映射。

映射之后才加入的材质不会自动发现,应在元素存在后重新赋值。

事件​

pc-node 支持与实体相同的指针事件,作用于被绑定几何体。绑定使部件成为拾取目标,未绑定部件命中则交给 pc-model。

事件说明
click主按钮在节点上按下并释放
pointercancel浏览器取消按下时在起始节点触发,例如触摸转为滚动,不产生 click
pointerdown在节点上按下
pointerenter从整个子树之外进入节点或后代,不冒泡
pointerleave离开节点及全部后代,不冒泡
pointermove在节点上移动
pointerout离开节点,relatedTarget 为目标元素
pointerover进入节点,relatedTarget 为来源元素
pointerup在节点上释放

事件沿 DOM 元素树传播,不沿模型节点树。命中绑定节点下几何体时,以此 pc-node 为目标,除非更近的 pc-node 代表该部分。后者只有在标记中嵌套于前者时才冒泡到它;同级则直接冒泡到模型。

onclick 和 onpointer* 与实体一致,包括按下释放命中不同部件时的点击解析。

示例​

GLB 有 play 橙色镂空外壳和 canvas 深色内盒,还残留空 Light 与 Camera,可用 hierarchy() 查看。节点绑定 play,通过 material-overrides 将橙色换蓝。可改绑 canvas,或 enabled=false 隐藏外壳。拖动环绕:

实时示例
<pc-app>
<pc-asset src="https://cdn.jsdelivr.net/npm/[email protected]/scripts/esm/camera-controls.mjs"></pc-asset>
<pc-asset src="https://developer.playcanvas.com/assets/playcanvas-cube.glb" id="cube"></pc-asset>
<pc-material id="repaint" name="Repaint" diffuse="#4a9eff"></pc-material>
<pc-scene>
<pc-entity name="camera" position="0 0 3">
<pc-camera clear-color="#1d1f2b"></pc-camera>
<pc-script>
<pc-script-instance name="cameraControls" enable-pan="false" zoom-range="1.5 6"></pc-script-instance>
</pc-script>
</pc-entity>
<pc-entity name="light" rotation="45 30 0">
<pc-light intensity="2"></pc-light>
</pc-entity>
<pc-model asset="cube">
<!-- Bind the node named "play" and swap in the repaint material -->
<pc-node name="play" material-overrides='{"index:0": "repaint"}'></pc-node>
</pc-model>
</pc-scene>
</pc-app>

JavaScript 接口​

可以通过 NodeElement API创建和操作元素。

entity 是绑定节点。state 为 pending 表示无 name 或模型未实例化,bound 成功,missing、ambiguous、duplicate 分别为解析失败。path 是相对查询范围的斜杠路径,未绑定为 null。可据此断言绑定,无需只看控制台:

import { whenReady } from '@playcanvas/web-components';

const node = await whenReady('pc-node[name="Roof"]');
console.log(node.state, node.path); // 'bound' 'Body/Roof'

materialOverrides 是覆盖材质映射对象形式,无需 JSON 字符串:

const body = await whenReady('pc-node[name="Body"]');
body.materialOverrides = { 'name:CarPaint': 'candy-red' };
body.materialOverrides = null; // back to the authored materials

元素保存冻结副本,之后修改原对象不生效,应重新赋新映射。property 不反映回 attribute,与其他覆盖属性一致。

另请参阅​

示例:产品查看器、布娃娃和车辆物理。