旋转 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
}
我希望能够通过单击按钮旋转 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
}