【问题标题】:Forge viewer model position after transformation变形后伪造查看器模型位置
【发布时间】:2018-12-02 18:29:33
【问题描述】:

我使用Model transformation extension 将模型从一个点移动到另一个点。现在如何获得转换模型或其边界框的新位置/坐标/位置,因为当我查询边界框最小和最大点时,它们始终相同。有任何想法吗?? 我的目标是翻译后根据原点得到模型的新位置。

【问题讨论】:

    标签: javascript three.js autodesk-forge autodesk-viewer


    【解决方案1】:

    我隔离了该扩展的核心部分,并检查了转换前后的位置和边界框。简单来说,只翻译。看起来这些值在转换后更新。您能否检查一下它是否有助于诊断您的问题?

    要对其进行测试,请选择一个对象并运行该函数。

    getModifiedWorldBoundingBox (fragIds, fragList) {
    
       const fragbBox = new THREE.Box3()
       const nodebBox = new THREE.Box3()
    
      fragIds.forEach(function(fragId) {
    
         fragList.getWorldBounds(fragId, fragbBox)
    
         nodebBox.union(fragbBox)
      })
    
      return nodebBox
    }
    
     $('#test').click(function(rt){
    
            var dbids = NOP_VIEWER.getSelection();
            var it = NOP_VIEWER.model.getData().instanceTree;
            var fragList = NOP_VIEWER.model.getFragmentList();  
    
            fragIds = [];
    
            it.enumNodeFragments(dbids[0], function(fragId) {
                fragIds.push(fragId); 
            }, false);
    
            var bb = getModifiedWorldBoundingBox(fragIds,fragList);
            console.log('boundingbox before transform: [max,min]: ' + 
            bb.max.x + ' ' + bb.max.y + ' ' + bb.max.z + '\n'+ 
            bb.min.x + ' ' + bb.min.y + ' ' + bb.min.z ); 
    
            fragIds.forEach(function(fragId){ 
    
                var fragProxy = NOP_VIEWER.impl.getFragmentProxy(
                NOP_VIEWER.model,
                fragId)
    
                fragProxy.getAnimTransform()
    
                console.log('frag position in LCS before transform:' + 
                                fragProxy.position.x + ','+
                                fragProxy.position.y + ','+ 
                                fragProxy.position.z);
    
                var wcsMatrix = new THREE.Matrix4(); 
                fragProxy.getWorldMatrix(wcsMatrix);
                var wcsPos = wcsMatrix.getPosition();
                console.log('frag position in wcs matrix  before transform: ' + 
                wcsPos.x + ' ' + wcsPos.y + ' ' + wcsPos.z);
    
    
                fragProxy.position.x += 10; 
                fragProxy.position.y += 10; 
                fragProxy.position.z += 10;   
    
                fragProxy.updateAnimTransform()  
            }); 
            NOP_VIEWER.impl.sceneUpdated(true) 
    
    
            fragIds.forEach(function(fragId){ 
    
                var fragProxy = NOP_VIEWER.impl.getFragmentProxy(
                NOP_VIEWER.model,
                fragId)
    
                fragProxy.getAnimTransform()
    
                console.log('frag position in LCS after transform:' + 
                                fragProxy.position.x + ','+
                                fragProxy.position.y + ','+ 
                                fragProxy.position.z); 
    
                var wcsMatrix = new THREE.Matrix4(); 
                fragProxy.getWorldMatrix(wcsMatrix);
                var wcsPos = wcsMatrix.getPosition();
                console.log('frag position in wcs matrix  after transform: ' + 
                wcsPos.x + ' ' + wcsPos.y + ' ' + wcsPos.z);
            }); 
    
            bb = getModifiedWorldBoundingBox(fragIds,fragList);
            console.log('boundingbox after transform: [max,min]: ' + 
            bb.max.x + ' ' + bb.max.y + ' ' + bb.max.z + '\n'+ 
            bb.min.x + ' ' + bb.min.y + ' ' + bb.min.z ); 
    
        });
    

    【讨论】:

    • 亲爱的Xiaodon,感谢您的回答。实际上,这不是我正在寻找的解决方案。我的工作流程应该是这样的: 1 - 我转换模型。 2 - 我使用 viewer.impl.modelQueue().getModels() 来获取加载模型的列表 3 - 使用迭代我得到每个模型的边界框。根据您的解决方案,我不需要遍历所有片段,因为这会消耗大量时间,我只需要整个模型的当前位置(如插入点)。
    • 我需要 getRootElement() 然后 getPosition() 之类的东西
    • 据我所知,如果模型/对象被转换,原始数据(viewer.model.getData())将不会被更新。它看起来获得更新位置的唯一方法将取决于检查片段的代理,就像我的代码一样。或者,您可以将更新后的矩阵设置为 Javascript 对象模型。例如model.transform = XXX 每次模型变换时。
    • 我尝试执行此解决方案只是为了好玩,但它说 - 未定义 getModifiedWorldBoundingBox。这是真正的。您没有定义它,并且它在引用扩展中不可用。 Viewer3D.js 也不是。也许在 Three.js 中?
    • @MikhailKh 我很抱歉!我什至忘了附上这个函数:( getModifiedWorldBoundingBox 。它现在可用。它只是我们为这个工作流定义的一个帮助函数。谢谢你的指出!
    猜你喜欢
    • 2021-03-16
    • 2021-11-07
    • 2018-08-22
    • 2018-06-28
    • 2018-10-22
    • 2019-05-15
    • 2019-02-06
    • 2019-12-10
    • 2018-09-22
    相关资源
    最近更新 更多