如何以建筑物中心为轴旋转建筑物?
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()
方法设置新矩阵。以上是关于如何以建筑物中心为轴旋转建筑物?的主要内容,如果未能解决你的问题,请参考以下文章