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

调用setPlacementTransform平移旋转RVT模型时恢复原始缩放比例问题

问题原因

你遇到的尺寸异常是setPlacementTransform方法的覆盖特性和不同格式模型的单位适配逻辑共同导致的:

  • .skp格式模型的原始单位通常为米,在配置applyScaling: { to: "meters" }加载后,模型默认的定位变换矩阵中缩放系数为1,你直接传入仅包含平移、旋转的矩阵替换原有矩阵时,没有缩放参数也不会出现尺寸变化。
  • .rvt等格式的模型原始单位多为英尺或毫米,加载时applyScaling配置会自动在模型默认的定位变换矩阵中加入对应比例的缩放参数,你直接传入仅含平移、旋转的矩阵会直接覆盖原有矩阵,丢失了适配米单位的缩放参数,因此模型会恢复为原始单位对应的尺寸,和你观察到的现象一致。

对应的效果对比:
SKP格式文件移动后运行正常
RVT格式文件移动后缩放异常

解决方法

不要直接替换定位变换矩阵,先获取模型已包含缩放参数的原有矩阵,再和你自定义的平移、旋转矩阵合并即可:

// 加载代码无需修改
viewer
    .loadDocumentNode(doc, viewables, {
      applyScaling: { to: "meters" },
      globalOffset: { x: 0, y: 0, z: 0 },
      keepCurrentModels: true,
    })

// 调整变换矩阵设置逻辑
// 1. 先获取模型原有带适配缩放的变换矩阵
const originalTransform = this.viewer.model.getPlacementTransform();
// 2. 生成自定义平移、旋转矩阵
this.translation = new THREE.Matrix4().makeTranslation(
    this.valueX,
    this.valueY,
    this.valueZ
);
const angleRadian = CoordinateConverter.degreeToRadian(this.valueRot);
let rotate = new THREE.Matrix4().makeRotationZ(angleRadian);
const customTransform = this.translation.multiply(rotate);
// 3. 合并矩阵,保留原有缩放的同时叠加自定义变换
const finalTransform = originalTransform.multiply(customTransform);
// 4. 设置最终变换矩阵
this.viewer.model.setPlacementTransform(finalTransform);

内容的提问来源于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.26 06:24:05