Forge Viewer中Transform control操作模型时出现偏移间隙该如何解决?
问题原因
你计算得到的边界框中心是模型几何的世界坐标中心,但模型的placementTransform偏移对应的是模型自身的原点位置,两者本身存在固定偏移。模型体积越大,几何中心和模型原点的偏移量就越大,就会出现你观察到的间距随模型体积增大而变大的现象。
修复步骤
- 在选择模型计算边界框的逻辑中,新增计算模型几何中心相对于模型原点的偏移量并存储
- 在控件触发位置更新时,将偏移量扣除后再赋值给模型的放置变换参数
修改后代码
// 新增存储偏移量的变量 this._modelOffset = new THREE.Vector3(); _onControlsChange(ev) { if (this.selectedModel) { const posTransform = this._controls.position; let tr = this.selectedModel.getPlacementTransform(); // 扣除偏移量后再赋值给模型变换的位移参数 tr.elements[12] = posTransform.x - this._modelOffset.x; tr.elements[13] = posTransform.y - this._modelOffset.y; tr.elements[14] = posTransform.z - this._modelOffset.z; this.selectedModel.setPlacementTransform(tr); this._viewer.impl.invalidate(true, true, true); } } _onSelectionChange(ev) { const selSet = ev.selections; const firstSel = selSet[0]; if (firstSel) { const listdbIds = firstSel.dbIdArray; const dbidItem = listdbIds[0]; const typeModel = dbidItem.toString().slice(0, 3); if (typeModel !== "500") return; const model = firstSel.model; this.selectedModel = model; let dbIds = firstSel.dbIdArray; let firstDbId = dbIds[0]; const instanceTree = model.getData().instanceTree; const fragList = model.getFragmentList(); let bounds = new THREE.Box3(); instanceTree.enumNodeFragments( firstDbId, (fragId) => { let box = new THREE.Box3(); fragList.getWorldBounds(fragId, box); bounds.union(box); }, true ); const position = bounds.getCenter(); this._controls.setPosition(position); this._controls.visible = true; // 新增:计算几何中心相对于模型原点的偏移量 const trInv = this.selectedModel.getPlacementTransform().clone().invert(); this._modelOffset.copy(position).applyMatrix4(trInv); } else { this._controls.visible = false; this.selectedModel = null; } }
内容的提问来源于stack exchange,提问作者surya kumara
相关产品推荐
相关产品推荐

