在three.js

时间:2015-06-16 21:16:41

标签: javascript three.js

我已经挣扎了一段时间才能完成某些事情,部分原因是因为我甚至不知道我是否在正确的轨道上。

任务

我正在开发一个加载js模型的three.js Web应用程序,然后为它们分配我在three.js中定义的材料。手头的物体是房子。最终目标是在我的网格上尽可能地模拟自然光照(包括全局照明和环境光遮挡),并采用少量不同的组合。如果场景是完全静态的,我不会有问题,但我希望能够动态切换各种对象的可见性。毋庸置疑,当物体彼此分开时,这会产生粘性阴影(AO)的问题,因为我之前已经将照明和环境遮挡渲染并烘焙到我的纹理中,然后将其分配给我在三个部分中的分离网格内容。 ,所以我的three.js场景中没有任何灯光,以便在客户端轻松实现。

挑战

我已经以各种组合为我的对象预渲染了光照,因此有可用的替代纹理贴图。我试图找到一种方法来在运行时更新本地化面的纹理,这样当我删除投射阴影(AO)的对象时,我可以告诉下面的表面显示替代的无阴影纹理。

我目前的做法

在阅读了无数的在线资源和堆栈溢出问题和答案之后,我已经确定了

  • 动态更新纹理,我需要使用THREE.MeshFaceMaterial,为它提供多种替代材料,稍后再参考它们的索引。 (Change material or color in mesh face

  • 我无法告诉我的网格中的一个特定面现在在运行时使用索引n的材质,但我必须更改其中一个材质的纹理,并且所有使用该索引的面都将显示新纹理(对我的问题不是很灵活)。

我正在尝试在(WebGL / Three.js Different materials on one complex object (grid))实现该示例。

1)我甚至无法让这个工作

我能够在运行时更改面的颜色,但不能更改纹理。当我尝试使用THREE.MeshFaceMaterial并将其指定给几何体时,网格只会以随机颜色显示,但是当我直接指定其中一种材质时,它会显示正常。见这里:(http://tinyurl.com/ndh99j4)。您是否有一个可以快速指出问题的调试工具?当我在firebug中检查DOM时,avalon.materials.planes_m的结构似乎适用于THREE.FaceMeshMaterial并且我没有收到任何错误。

2)这是否是实现我需要的最佳方法?

假设我可以让它工作,并且我能够更新选定面上的纹理,我将最终得到纹理a和纹理b不适合的硬边(不同的照明场景)。我的下一步是使用自定义着色器使用顶点颜色(http://www.chandlerprall.com/2011/06/blending-webgl-textures/)来修复它吗?看起来你可以通过在顶点而不是面上设置材质来混合纹理。这两种解决方案完全一致吗?这导致我走错了路吗?我对游戏开发的最佳实践知识有限。我知道我可以在运行时模拟环境遮挡,但这并不能解决我对全局照明和最终聚集的需求,因此我仍然需要将光照融入我的纹理中。

我一直在研究将灯光分成光照贴图(http://threejs.org/examples/#webgl_materials_lightmap)和混合贴图(http://threejs.org/examples/#webgl_materials_blending),但这些确实解决了不同的问题。

游戏开发者如何才能最好地应对这一挑战?

2 个答案:

答案 0 :(得分:1)

我建议您研究屏幕空间AO方案,而不是烘焙地图。如果几何形状发生变化,SSAO将更加灵活。最简单的SSAO技术是对场景深度做一个非锐化的掩模,原始论文在这里:http://www.cgmi.inf.uni-konstanz.de/publikationen/2006/unsharp_masking/Luft%20et%20al.%20--%20Image%20Enhancement%20by%20Unsharp%20Masking%20the%20Depth%20Buffer.pdf它优雅而简单,我在从旧金山到纽约的航班上编写了我的第一份副本小睡。

答案 1 :(得分:0)

对所有方面:

var materialIndex;
for (var i = 0; i < 12; i ++) {
    if(i%2==0) materialIndex = new_texture_index;
    cube.geometry.faces[ i ].materialIndex = materialIndex;
}

new_texture_index要适当更换。

所以对于一方而言,你需要拥有像{0,1},...... {10,11}

这样的面孔。