在查看器中旋转2D可视

时间:2017-07-10 14:35:19

标签: autodesk-viewer

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

我已经看到使用滚动工具可以使用鼠标将其关闭,但我希望能够一次将可视区旋转90度。

2 个答案:

答案 0 :(得分:1)

此代码显示如何围绕特定轴和中心旋转一组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
}

答案 1 :(得分:0)

所以我尝试了一些接近你想做的事情,但也许你需要做一些研究,以检查场景是否可以在点击按钮时更新,而模型已经在场景,我认为调用viewer.impl.sceneUpdated(true)会有所作为,但我不确定,还要记住这个功能似乎不公开所以没有好的文档。

让我解释一下我以前尝试过的事情。我建立了一个样本,你有一个2D Lot模型,在选择其中一个折线或批次的阴影后,你可以添加一个代表一个房子的第二个模型。样品在左下角有3个按钮,并且有一个输入框,允许您输入0-360度的值,以便加载第二个模型并使用您想要的旋转。

以下是repo的链接,其中还包含演示的链接。 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)
  }
}