如何在modelBuilder嵌入唯一ID并加载多个SceneBuilder模型
问题1:SceneBuilder模型嵌入唯一ID的实现方法
- 你观察到的dbId仅作用于单个mesh是对的,若需要给整个SceneBuilder创建的模型绑定唯一ID,可在调用
addNewModel时传入自定义modelId参数,该ID为模型级的全局唯一标识,后续可通过viewer.impl.getModelById(自定义ID)直接获取对应的模型实例。 - 若需要同时保留模型级和mesh级的自定义标识,可直接给
addNewModel返回的模型实例挂载自定义属性,例如modelBuilder.model.customId = '自定义标识',该属性会持久挂载在模型对象上,不会被框架覆盖。 - 注意同一modelBuilder实例下的多个mesh的dbId不可重复,跨不同modelBuilder的mesh dbId不受限制。
问题2:多SceneBuilder模型加载与单对象单独移动的解决方案
首先修正你现有代码的bug
addSphere方法中存在变量引用错误:this.sphere = new THREE.Mesh(boxBuff, this.globalMaterial)中的boxBuff未定义,需替换为你声明的sphereBuff,否则会抛出运行时错误。
多模型加载的支持说明
SceneBuilder本身完全支持加载多个独立模型,你现有代码中每次调用addNewModel的逻辑是正确的,每个调用都会生成独立的模型实例,不存在只能加载单个模型的限制。
单独移动单个对象的实现方案
你现在所有对象同步移动的核心原因是操作时修改了模型整体的变换矩阵,或者未开启跨模型的单元素选择能力,按以下步骤修改即可实现需求:
- 加载
AggregateSelection扩展,开启跨模型的单个mesh选择能力,这样点击场景中的对象时,选择回调会返回选中对象对应的模型实例和dbId,不会默认选中整个模型:
await viewer.loadExtension('Autodesk.Viewing.AggregateSelection')
- 监听点击选择事件,拿到选中的mesh对象后,直接修改mesh的position/rotation属性,再调用对应modelBuilder的
updateMesh方法刷新即可,不会影响其他对象:
// 选择事件监听示例 viewer.addEventListener(Autodesk.Viewing.AGGREGATE_SELECTION_CHANGED_EVENT, (event) => { if (event.selections.length === 0) return // 拿到选中的对象信息 const selected = event.selections[0] const targetModel = selected.model const targetDbId = selected.dbIds[0] // 从对应model中获取mesh实例 const targetMesh = targetModel.getFragmentList().getMesh(targetDbId) // 修改位置,比如沿X轴移动1单位 targetMesh.position.x += 1 // 找到该model对应的modelBuilder实例,调用updateMesh刷新 targetModel.modelBuilder.updateMesh(targetMesh) })
注:你需要在创建modelBuilder时将其挂载到对应model的属性上,比如targetModel.modelBuilder = modelBuilder,方便后续调用更新方法
内容的提问来源于stack exchange,提问作者surya kumara
相关产品推荐
相关产品推荐

