放大对象,如双击事件
Zoom into object like double click event
我试图在查看器中创建一个放大对象的功能,例如双击事件。我发现 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 都有自己的边界框,我如何确定整个对象的边界框。
提前致谢。
实施zoom-to-object
您绝对可以使用 fitToView 方法实现与 double-clicking Forge Viewer 中的对象相同的“zoom-to-object”功能。请记住,该方法的第一个参数必须是一个数组。因此,例如,如果您想放大 dbID 为 1234 的对象,则方法调用将为 viewer.fitToView([1234]);
为什么对象和片段之间存在1-to-many映射?
Forge Viewer 中的单个可选 对象(例如,一扇门)通常可以由具有不同 material 的多个部分组成(例如,一个木框和一个金属门把手)。然后,这些部分将表示为单独的 片段 ,每个片段指定其自己的几何形状、material、变换和边界框。
计算多个边界框的并集
Forge Viewer 中的边界框通常使用 THREE.Box3 class which provides several helper methods incl. 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;
}
我试图在查看器中创建一个放大对象的功能,例如双击事件。我发现 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 都有自己的边界框,我如何确定整个对象的边界框。
提前致谢。
实施zoom-to-object
您绝对可以使用 fitToView 方法实现与 double-clicking Forge Viewer 中的对象相同的“zoom-to-object”功能。请记住,该方法的第一个参数必须是一个数组。因此,例如,如果您想放大 dbID 为 1234 的对象,则方法调用将为 viewer.fitToView([1234]);
为什么对象和片段之间存在1-to-many映射?
Forge Viewer 中的单个可选 对象(例如,一扇门)通常可以由具有不同 material 的多个部分组成(例如,一个木框和一个金属门把手)。然后,这些部分将表示为单独的 片段 ,每个片段指定其自己的几何形状、material、变换和边界框。
计算多个边界框的并集
Forge Viewer 中的边界框通常使用 THREE.Box3 class which provides several helper methods incl. 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;
}