You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Forge Viewer中Transform control操作模型时出现偏移间隙该如何解决?

问题原因

你计算得到的边界框中心是模型几何的世界坐标中心,但模型的placementTransform偏移对应的是模型自身的原点位置,两者本身存在固定偏移。模型体积越大,几何中心和模型原点的偏移量就越大,就会出现你观察到的间距随模型体积增大而变大的现象。

修复步骤

  1. 在选择模型计算边界框的逻辑中,新增计算模型几何中心相对于模型原点的偏移量并存储
  2. 在控件触发位置更新时,将偏移量扣除后再赋值给模型的放置变换参数

修改后代码

// 新增存储偏移量的变量
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:36:04