问题描述
我想了解Autodesk Forge Viewer如何将节点元素存储在多个THREE.Scene对象中.有几个场景:
I want to understand how Autodesk Forge viewer stores node elements in multiple THREE.Scene objects. There are several scenes:
viewer.impl.scene // The main scene
viewer.impl.overlayScenes // Three overlay scenes: selection, pivot and roll
每当在Forge查看器中选择一个元素时,该元素的THREE.Mesh对象都会添加到viewer.impl.overlayScenes.selection.scene.children中.但是它的边界几何总是零,不像原始的三.网格对象在执行geometry.computeBoundaryBox()
Whenever an element is selected in Forge viewer, its THREE.Mesh object is added to viewer.impl.overlayScenes.selection.scene.children. However its boundary geometry is always zero, unlike primitive THREE.Mesh objects will have boundaries after executing geometry.computeBoundaryBox()
由于Forge元素的边界为零,因此我无法使用THREE.Raycaster来投影覆盖元素以通过鼠标拾取来获取其dbId.如何选择内部dbId,因为它将获得外部dbId? Forge查看器不允许在单击外部对象时选择内部对象.如何在另一个元素中选择一个元素?
Because of the zero boundary of Forge elements, I cannot use THREE.Raycaster to project through overlay elements to get their dbIds on mouse pick. How can I select the inner dbId because it will get the outer dbId? The Forge viewer does not allow to select inner object on click on outer object. How to select an element within another element?
主要场景也有空孩子.所有元素在哪里,如何在屏幕上呈现?
The main scene also has empty children. Where are all elements and how can they render on the screen?
了解Forge查看器数据结构以具有完整的API控件将有更好的文档.我必须自己学习Autodesk Forge查看器的viewer3D.js和wgs.js.
It would have better documentation to understand the Forge viewer data structure to have the full API control. I have to learn by myself with viewer3D.js and wgs.js of Autodesk Forge viewer.
推荐答案
以下是两种方法,向您展示如何根据fragmentIds访问特定组件的边界框:
Here are two methods that shows you how to access the bounding boxes of specific components based on their fragmentIds:
//returns bounding box as it appears in the viewer
// (transformations could be applied)
function getModifiedWorldBoundingBox(fragIds, fragList) {
var fragbBox = new THREE.Box3();
var nodebBox = new THREE.Box3();
fragIds.forEach(function(fragId) {
fragList.getWorldBounds(fragId, fragbBox);
nodebBox.union(fragbBox);
});
return nodebBox;
}
// Returns bounding box as loaded in the file
// (no explosion nor transformation)
function getOriginalWorldBoundingBox(fragIds, fragList) {
var fragBoundingBox = new THREE.Box3();
var nodeBoundingBox = new THREE.Box3();
var fragmentBoxes = fragList.boxes;
fragIds.forEach(function(fragId) {
var boffset = fragId * 6;
fragBoundingBox.min.x = fragmentBoxes[boffset];
fragBoundingBox.min.y = fragmentBoxes[boffset+1];
fragBoundingBox.min.z = fragmentBoxes[boffset+2];
fragBoundingBox.max.x = fragmentBoxes[boffset+3];
fragBoundingBox.max.y = fragmentBoxes[boffset+4];
fragBoundingBox.max.z = fragmentBoxes[boffset+5];
nodeBoundingBox.union(fragBoundingBox);
});
return nodeBoundingBox;
}
您可以从下面的博客文章中找到完整的示例:
You can find a comprehensive sample from the blog post below:
这篇关于Autodesk Forge Viewer如何管理多个场景以选择多个元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!