我们正在使客户端在页面加载时检索对象状态(这将导致模型中的“待定”对象变成不同的颜色)。然后我们轮询更改以更新着色(首先:挂起的对象在观察者加载时变色,然后我们继续轮询以检查并再次改变状态,以使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);
}
答案 0 :(得分:0)
我不知道你是如何实现你的应用程序的,所以我只告诉你在你的代码中找到了什么。如果你想解决你所解决的问题,你可以考虑提供一个可重复的案例来证明这一点,我很乐意将它传递给我们的开发团队。以下项目应在可重现的案例中:
Forge app
,可以使用一个简单的程序运行和调试,以分析其行为在样本模型中。three.js app
,可以运行并演示您想要的着色器效果。 注意。 Forge Viewer正在使用r71 three.js
。 如果您的可复制案例无法在此公开发布,请在发送之前将其发送至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()
。否则,它看起来不像透明物体。