改变旋转轴

change axis of rotation

我正在借助 Transform tutorial 的示例代码进行旋转和位置更改。我面临几个问题。

  1. 我想在门上执行旋转 window。当前旋转轴穿过中心。我怎样才能更改为从穿过其侧面的轴旋转对象。

  2. 对于位置变化 > 当我改变位置时,可以说 window 在任何方向上,它移动但在墙上可见。我想让它在 window 撞墙时隐藏。

1/ 这是一个代码片段,说明如何旋转元素(片段),如需更完整的示例,请查看这篇文章:Rotate Components Control for the Viewer

rotateFragments (model, fragIdsArray, axis, angle, center) {

  var quaternion = new THREE.Quaternion()

  quaternion.setFromAxisAngle(axis, angle)

  fragIdsArray.forEach((fragId, idx) => {

    var fragProxy = this.viewer.impl.getFragmentProxy(
      model, fragId)

    fragProxy.getAnimTransform()

    var position = new THREE.Vector3(
      fragProxy.position.x - center.x,
      fragProxy.position.y - center.y,
      fragProxy.position.z - center.z)

    position.applyQuaternion(quaternion)

    position.add(center)

    fragProxy.position = position

    fragProxy.quaternion.multiplyQuaternions(
      quaternion, fragProxy.quaternion)

    if (idx === 0) {

      var euler = new THREE.Euler()

      euler.setFromQuaternion(
        fragProxy.quaternion, 0)

      this.emit('rotate', {
        dbIds: this.selection.dbIdArray,
        fragIds: fragIdsArray,
        rotation: euler,
        model
      })
    }

    fragProxy.updateAnimTransform()
  })
}

2/ 当你变换几何体时,你只是在四处移动三角形,没有内置逻辑会隐藏组件,因为它们重叠,你需要自己实现。您应该能够找到计算两个网格是否相交的 Three.js 代码(三角形-三角形相交算法)和 运行 计算您正在移动的组件和周围所有墙壁的代码。这里有一些东西可以让你走上正轨:How to detect collision in three.js?

希望对您有所帮助