跳转到内容

组合

相关参考:

组合(Group)适合把多个对象当成一个整体来管理。

组合也是3D对象,因此3D对象支持的功能也都可以使用。

因为只是一种封装容器,因此组合不能被直接看见。

普通的3D对象,本质上也是一种组合。也可以使用addChildremoveChildgetChildren等功能。

只是在代码可读性上,更建议直接使用Group,而不是普通3D对象。

创建组合

js
const group = await api.createGroup();
await api.add(group);

将对象挂到组合下

js
const image = await api.getObject('image');
const model = await api.createGltfModel(glbBuffer);

await api.add(model);

await api.addChild(group, image);
await api.addChild(group, model);

之后你对 group 的位置、旋转、缩放修改,会整体影响其子对象。

组合可以继续挂到组合下,形成多层次的树状结构。

常见使用场景

把“标题 + 图标 + 按钮”打成一个整体

如果你在场景里动态加了多张图片或多个模型,希望它们一起移动,组合会非常实用。

暂时替代编辑器中的预设结构

有些业务不方便把所有层级都提前放进场景编辑器,也可以在运行时通过 createGroup() 组装一棵简单的层级树。

查询组合子节点

js
const children = await api.getChildren(group);

或按属性查找:

js
const child = await api.getChildByProperty(group, 'name', 'title-image');

解除挂接

js
await api.removeChild(group, image);

对象只是从组合中移除,和remove()类似,不会销毁资源,后续还可以继续add()addChild()

如果要彻底移除,则需要执行destroyObject()

推荐习惯

  1. 在把对象加入组合前,先为对象设定清晰名称。
  2. 组合本身也建议命名,方便后续排查。
  3. 需要整体开关显隐时,优先改组合对象,而不是逐个改子对象。