如何以建筑物中心为轴旋转建筑物?

Posted

技术标签:

【中文标题】如何以建筑物中心为轴旋转建筑物?【英文标题】:How to rotate the building with its axis in the center of the building? 【发布时间】:2021-11-30 22:15:23 【问题描述】:

我制作了一个可以改变建筑物位置及其旋转的工具。 当我改变建筑物的位置并继续改变旋转时,位置又回到了原来的样子。 第二个问题,我可以根据中心轴旋转建筑物吗? 代码如下:

     // position 
     this.viewer.model.setPlacementTransform(
      new THREE.Matrix4().setPosition(
        x: this.valueX,
        y: this.valueY,
        z: this.valueZ,
      )
    );

   //rotation
   this.viewer.model.setPlacementTransform(
      new THREE.Matrix4().makeRotationZ(angleRadian)
    );

【问题讨论】:

【参考方案1】:

setPlacementTransform修改模型转换矩阵,它覆盖它。因此,当您调用 this.viewer.model.setPlacementTransform(new THREE.Matrix4().makeRotationZ(angleRadian)); 时,您基本上会覆盖之前应用于模型的任何转换矩阵。

对此的解决方案是将旋转和平移组合成一个变换矩阵:

const rotation = new THREE.Matrix4().makeRotationZ(angleRadian);
const translation = new THREE.Matrix4().makeTranslation(someX, someY, someZ);
this.viewer.model.setPlacementTransform(rotation.multiply(translation));
// or `this.viewer.model.setPlacementTransform(translation.multiply(rotation));` depending on the order you need

【讨论】:

感谢您的回答。我使用this.viewer.model.getPlacementTransform() 使用当前的matrix4 模型怎么样?但是在我将它与新的平移或旋转相乘后,没有任何变化。 我不会假设getPlacementTransform() 给了我一个矩阵的实例,我可以按原样修改。无论您如何获得乘法的输入矩阵,最好使用setPlacementTransform() 方法设置新矩阵。

以上是关于如何以建筑物中心为轴旋转建筑物?的主要内容,如果未能解决你的问题,请参考以下文章

建筑-门-勃兰登堡门:百科

旋转设备时磁场测量的奇怪行为

HNOI 2016 地图

模块化混凝土拱形建筑群

如果纬度/经度上有多个标记,我如何旋转地图标记

香港首个模块化建筑项目面市 中集出品的!