three.js - Autodesk forge viewer api v7.* 对齐多个 2d dwg 模型
问题描述
我在项目中使用 Autodesk Forge 查看器 v7.*。在这个项目中,我必须展示来自.dwg
上传到 BIM360 的文件的多个 2d 模型。我可以加载每个模型,它们彼此堆叠,但它们的对齐似乎完全错误。我已经尝试了各种方法loadOptions
,也尝试过调整模型的整体转换,但它们的对齐仍然看起来很随机。这是代码的一部分:
onDocumentLoaded = (doc, id, resolve, reject) => {
// A document contains references to 3D and 2D geometries.
let geometries = doc.getRoot().search({ 'type': 'geometry' })
if (geometries.length === 0) {
console.error('Document contains no geometries.')
return
}
// Choose any of the avialable geometries
let initGeom = geometries[0]
let ops = {
placementTransform: new window.THREE.Matrix4(),
modelSpace: true,
globalOffset: { x: 0, y: 0, z: 0 },
applyRefPoint: true,
isAEC: true, // to align the models,
}
// Load the chosen geometry
let svfUrl = doc.getViewablePath(initGeom)
this.viewerApp.loadModel(svfUrl, ops, (model) => this.onModelLoaded(model, id, resolve, reject), (error) => reject(error))
}
如您所见,我尝试了一些加载选项,但在加载 2d 模型时它们似乎都无关紧要。它们确实对 3d(.ifc、.rvt、.nwd)模型有影响。
我还尝试在加载模型后更新转换:
transformModel = (viewer, model, transform) => {
let translation = new window.THREE.Vector3();
let rotation = new window.THREE.Quaternion();
let scale = new window.THREE.Vector3();
transform.decompose(translation, rotation, scale);
function transformFragProxy(fragId) {
var fragProxy = viewer.impl.getFragmentProxy(
model,
fragId);
fragProxy.getAnimTransform();
fragProxy.position = translation;
fragProxy.scale = scale;
fragProxy.quaternion._x = rotation.x;
fragProxy.quaternion._y = rotation.y;
fragProxy.quaternion._z = rotation.z;
fragProxy.quaternion._w = rotation.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);
}
}
onModelLoaded = (model, id, resolve) => {
if (!model.isLoadDone()) {
// wait for loading complete, 2d models are not completely loaded even though onModelLoaded is called
setTimeout(this.onModelLoaded, 0.1, model, id, resolve)
} else {
// done loading
// force transformation
this.transformModel(this.viewerApp, model, new window.THREE.Matrix4());
this.viewerApp.impl.sceneUpdated(true);
// .. rest op code here
}
}
解决方案
推荐阅读
- firebase - 如何将 Firebase 身份验证添加到 Flutter?
- scala - 如何在scala中动态实例化数组缓冲区[Type]
- webrtc - WebRTC 的非对称视频编解码器
- python - 为什么 Python 从 shell 脚本开始时会忽略 SIGINT?
- python - Python:在索引 [x] 处引用列表中对象的属性
- html - 的不同对齐方式
- python - 如何在 Flask 中显示 json2table?
- python - 如何在开头的ndarray中插入数字(i + 1)?
- delphi - Delphi 中用于本地化的 UILocale 是什么?
- amazon-web-services - Terraform 抛出无效的子网范围错误