更改 Forge 中的材料

art*_*bii 6 autodesk-viewer autodesk-forge

目前,我们正在让客户端在页面加载时检索对象状态(这将导致模型中的“待处理”对象变成不同的颜色)。然后我们轮询更改以更新着色(首先:当查看器加载时,挂起的对象会着色,然后我们继续轮询以再次检查和更改状态,以使 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/third.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);
}
Run Code Online (Sandbox Code Playgroud)

Eas*_*ang 1

我不知道你如何实现你的应用程序,所以我只告诉你我在你的代码中发现的内容。如果您想解决您所解决的问题,您可以考虑提供一个可重现的案例来证明这一点,我很乐意将其传递给我们的开发团队。以下项目应处于可重现的情况下:

  1. 对您想要实现的目标的简短准确描述。您观察到的行为与您期望的行为,以及为什么这是一个问题。
  2. 用于运行测试的完整但最小的示例源模型。
  3. 一个完整但最小的Forge app模型可以通过一个简单的过程来运行和调试,以分析其行为,并存在于示例模型中。
  4. 一个完整但最小的纯粹three.js app,可以运行并演示您想要的着色器效果。笔记。Forge Viewer 使用 r71 three.js
  5. 用于重现问题的详细分步说明,例如选择哪个元素、启动什么命令等。

如果您的可重现案例无法在此处公开发布,请将其发送至forge.help@autodesk.com在发送前删除敏感数据或信息

===我在你的代码中发现了一些东西:

我发现您的ColorMaterial扩展中有一些错误的类型和缺少的操作。材质的颜色属性应该是 的 a 类型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 );

        // ...........
    };
Run Code Online (Sandbox Code Playgroud)

它的结果在这里: 在此输入图像描述

ColorOverlay扩展中,材质颜色属性的类型也是错误的,它THREE.Color也应该是 的类型。将其更改为THREE.Color应该可以正常工作。另外,overlay是覆盖在3D物体上的,所以你应该viewer.hide()和你的setColorOverlay()一起调用。否则,它看起来就不像透明物体了。

不隐藏墙壁的 3D 对象: 在此输入图像描述

隐藏墙的 3D 对象: 在此输入图像描述