问题描述
我试图在查看器中创建一个功能放大对象,例如双击事件。我发现fitToView
方法可确保在查看器中已选中但未放大。请按照此处的答案进行操作:
Autodesk forge viewer zooming to bounding box
我需要找到对象的边界框,我会得到所需的东西。我基于本文来确定对象边界框https://forge.autodesk.com/blog/working-2d-and-3d-scenes-and-geometry-forge-viewer。
我有一个问题:为什么1个对象有许多fragId,而每个fragId都有自己的边界框,我如何确定整个对象的边界框。
预先感谢。
解决方法
实现对象缩放
您绝对可以使用fitToView方法来实现与在Forge Viewer中双击对象相同的“缩放到对象”功能。请记住,方法的第一个参数必须是数组。因此,例如,如果要放大具有dbID 1234的对象,则方法调用将为viewer.fitToView([1234]);
为什么对象和片段之间存在一对多映射?
Forge Viewer中的单个可选对象(例如,门)通常可以由具有不同材料的多个零件(例如,木制框架和金属门把手)组成。然后将这些部分表示为单独的片段,每个片段指定其自己的几何形状,材质,变换和边界框。
计算多个边界框的并集
Forge Viewer中的边界框通常使用THREE.Box3类表示,该类提供了几种帮助方法,包括。 union。此方法可用于扩展现有的边界框,以便它“包括”另一个边界框。
以下是计算特定对象所有片段的边界框的方法:
function computeObjectBounds(model,dbid) {
const frags = model.getFragmentList();
const tree = model.getInstanceTree();
let objectBounds = new THREE.Box3();
let fragBounds = new THREE.Box3();
tree.enumNodeFragments(dbid,function (fragid) {
frags.getWorldBounds(fragid,fragBounds);
objectBounds.union(fragBounds);
});
return objectBounds;
}