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

解决方法
不要直接替换定位变换矩阵,先获取模型已包含缩放参数的原有矩阵,再和你自定义的平移、旋转矩阵合并即可:
// 加载代码无需修改 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
相关产品推荐
相关产品推荐

