Forge

时间:2017-08-29 20:35:09

标签: autodesk-forge autodesk-viewer

我们正在使客户端在页面加载时检索对象状态(这将导致模型中的“待定”对象变成不同的颜色)。然后我们轮询更改以更新着色(首先:挂起的对象在观察者加载时变色,然后我们继续轮询以检查并再次改变状态,以使Forge呈现不同颜色的那些并存储他们的旧颜色/材料。当轮询收到对象不应再着色的更改时,它会告诉Forge再次使用旧的颜色/材质。

问题: 我们已经发现问题所在,但我们无法找到解决方法。问题是Forge中的材料更改在启动后不再起作用,它只能在前约3秒左右起作用(材料用于显示颜色)。

但是,设置叠加层即使在前~3秒后也能正常工作(显示叠加层而不是显示颜色的材质)。 这不是我们想要实现的目标。这看起来没有优化,因为叠加将通过一切显示出来。

然而,这些材料似乎是“锁定的”,因为它们在第一个~3秒后不能再被更换了。好像他们没有刷新或什么

在示例中,我们发现他们使用viewer.impl.invalidate(true)刷新Forge查看器,但在~3秒后没有做任何事情。

我们还尝试了viewer.impl.invalidate(true,true,true)的每个组合,以及将material.needsUpdate设置为true,以及尝试重新渲染整个场景。

我们也发现了这个:https://github.com/mrdoob/three.js/issues/790,但我们找不到在Forge中做到这一点的好方法,我们尝试了viewer.requestSilentRender(),但这也没有做任何事情。

无论如何,我们已经尝试了我们想出的所有内容,并且可以在网上找到这些材料,但没有任何区别。 我们希望找到一个对Forge工作方式更有经验的人,他们可以看到材料代码的错误。

至于内容,以下是了解正在发生的事情所需的所有代码: DROPBOX LINK

以下是设置颜色的“index.html”文件的一小部分:

try
{
   viewer.restoreAllColorOverlays(); //for materials instead of overlays: viewer.restoreAllColorMaterials();
   $.each(colors, function(color, selectionIds)
   {
      viewer.setColorOverlay(selectionIds, color); //for materials instead of overlays: viewer.setColorMaterial(selectionIds, color);
   });
}
catch(error)
{
   console.error(error);
}

1 个答案:

答案 0 :(得分:0)

我不知道你是如何实现你的应用程序的,所以我只告诉你在你的代码中找到了什么。如果你想解决你所解决的问题,你可以考虑提供一个可重复的案例来证明这一点,我很乐意将它传递给我们的开发团队。以下项目应在可重现的案例中:

  1. 您要实现的目标的简短描述。您观察到的行为与您的期望,以及为什么这是一个问题。
  2. 用于运行测试的完整但最小的样本源模型。
  3. 一个完整但最小的Forge app,可以使用一个简单的程序运行和调试,以分析其行为在样本模型中。
  4. 一个完整但极简的纯three.js app,可以运行并演示您想要的着色器效果。 注意。 Forge Viewer正在使用r71 three.js
  5. 有关复制问题的详细逐步说明,例如:选择哪个元素,启动什么命令等。
  6. 如果您的可复制案例无法在此公开发布,请在发送之前将其发送至forge.help@autodesk.com删除敏感数据或信息。

    === 我在您的代码中找到的内容:

    我发现此处ColorMaterial扩展程序中存在一些错误类型和缺失操作。材质的颜色属性应该是THREE.Color的类型。这是我的修改:

    Autodesk.Viewing.Viewer3D.prototype.setColorMaterial = function(objectIds, color)
        {
            if( !(color instanceof THREE.Color) ) throw 'Invalid argument: Color';
    
            var material = new THREE.MeshPhongMaterial
            ({
                 color:      color,
                 opacity:    0.8,
                 transparent: true
             });
    
            viewer.impl.matman().addMaterial( 'ColorMaterial-' + new Date().getTime(), material, true );
    
            // ...........
        };
    

    及其'结果在这里: enter image description here

    ColorOverlay扩展名中,材质颜色属性的类型也是错误的,它也应该是THREE.Color的类型。将其更改为THREE.Color应该可以正常工作。此外,叠加层覆盖了3D对象,因此您应该与viewer.hide()一起调用setColorOverlay()。否则,它看起来不像透明物体。

    无需隐藏墙壁的3D对象: enter image description here

    隐藏墙壁的3D对象: enter image description here