旋转 2D 在查看器中可见

Rotate 2D viewable in viewer

我希望能够通过单击按钮旋转 2D 可视项。

我看到可以使用滚动工具用鼠标将其放下,但我希望能够一次将可视项旋转 90 度。

所以我已经尝试了一些接近您想要做的事情,但也许您需要自己做一些研究,以检查场景是否可以在单击带有模型的按钮时更新在场景中,我认为调用 viewer.impl.sceneUpdated(true) 可以解决问题,但我不确定,还要记住这个函数似乎不是 public 所以没有很好的文档。

所以让我解释一下我之前尝试过的方法。我构建了一个示例,其中您有一个 2D Lot 模型,在选择其中一条折线或地块的影线后,您可以添加代表房屋的第二个模型。该示例在左下角有 3 个按钮,并且有一个输入框,允许您输入 0-360 度的值,以便以您想要的旋转加载第二个模型。

这里是 link 的 repo,其中还包含一个 link 的演示。 https://github.com/jaimerosales/viewer-dwgoffset

这是一个可能会给你一个想法的函数,我会尝试加载模型,然后应用变换,然后应用我之前提到的场景更新。

applyTransform (model) {

  var viewer = this._viewer

  // This is use for Transformation on 3D models, for 2D only pass rotation 
  // value on Z axis

  var euler = new THREE.Euler(
    model.transform.rotation.x * Math.PI/180,
    model.transform.rotation.y * Math.PI/180,
    model.transform.rotation.z * Math.PI/180,
    'XYZ')

  var quaternion = new THREE.Quaternion()

  quaternion.setFromEuler(euler)

  function _transformFragProxy (fragId) {

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

    fragProxy.getAnimTransform()

    fragProxy.position = model.transform.translation

    fragProxy.scale = model.transform.scale

    //Not a standard three.js quaternion
    fragProxy.quaternion._x = quaternion.x
    fragProxy.quaternion._y = quaternion.y
    fragProxy.quaternion._z = quaternion.z
    fragProxy.quaternion._w = quaternion.w

    fragProxy.updateAnimTransform()
  }

  var fragCount = model.getFragmentList().
    fragments.fragId2dbId.length

  //fragIds range from 0 to fragCount-1
  for (var fragId = 0; fragId < fragCount; ++fragId) {

    _transformFragProxy(fragId)
  }
}

此代码展示了如何围绕特定轴和中心旋转一组 fragId,如果要旋转整个模型,则需要旋转所有片段:

// Rotate selected fragments
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)

    fragProxy.updateAnimTransform()
  })
}

// get leaf node fragIds
static getLeafFragIds (model, leafId) {

  const instanceTree = model.getData().instanceTree

  const fragIds = []

  instanceTree.enumNodeFragments(
      leafId, (fragId) => {
      fragIds.push(fragId)
  })

  return fragIds
}