我希望能够通过按钮点击旋转2D可视图。
我已经看到使用滚动工具可以使用鼠标将其关闭,但我希望能够一次将可视区旋转90度。
答案 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)
}
}