【问题标题】:Changing materials in Forge在 Forge 中更改材料
【发布时间】:2018-02-07 10:20:25
【问题描述】:

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

【问题讨论】:

    标签: autodesk-forge autodesk-viewer


    【解决方案1】:

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

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

    如果您的可复制案例无法在此处公开发布,请将其发送至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 );
    
            // ...........
        };
    

    它的结果在这里:

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

    不隐藏墙体的 3D 对象:

    隐藏墙的 3D 对象:

    【讨论】:

    • 。您好,非常感谢您的回复。我们已按照您回复的第 2 部分中的说明采取了措施。可悲的是,它并没有使材料起作用,但它使覆盖层现在看起来好多了。我们非常有兴趣与 forge.help@autodesk.com 分享我们的项目
    猜你喜欢
    • 2018-07-13
    • 2021-01-04
    • 2019-01-04
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 2013-07-02
    • 2021-06-20
    • 1970-01-01
    相关资源
    最近更新 更多