2013-02-18 106 views
2

是否可以将两种材质分配到一个已使用JSONLoader加载的网格?带JSONLoader的多种材质?

我在搅拌机中制作了一个简单的字符并将其导出为three.js格式,其中包含变形目标和UV。

我试图给人体分配纯色材料,并将图片分配给我角色的头部(http://touhou.ru/dev/webgl-test-stackoverflow/kourindouhime.jpg),但在加载网格和材质后,我得到一个灰色网格。

这里的量产版我的项目(使用WASD移动,当你看到一个灰色的玩家网你会被控制,这正是我在谈论的东西):http://touhou.ru/dev/webgl-test-stackoverflow/

而这里的路我正在使用JSONLoader加载网格和材质:

var player_loader = new THREE.JSONLoader(); 

    player_loader.load("running_babe.js", function(geo, material) { 
    material[0].morphTargets = true; 
    material[1].morphTargets = true; 
    var materials = new THREE.MeshFaceMaterial(material); 
    player = new THREE.Mesh(geo, materials); 
    scene.add(player); 
    }); 

我做错了什么?


更新:问题出在我的出口。现在第二种材料看起来如此:

{ 
      "DbgColor" : 15597568, 
      "DbgIndex" : 1, 
      "DbgName" : "Material.001", 
      "blending" : "NormalBlending", 
      "colorAmbient" : [0.6400000190734865, 0.6400000190734865, 0.6400000190734865], 
      "colorDiffuse" : [0.6400000190734865, 0.6400000190734865, 0.6400000190734865], 
      "colorSpecular" : [0.5, 0.5, 0.5], 
      "depthTest" : true, 
      "depthWrite" : true, 
      "mapDiffuse" : "kourindouhime.jpg", 
      "mapDiffuseWrap" : ["repeat", "repeat"], 
      "shading" : "Lambert", 
      "specularCoef" : 50, 
      "transparency" : 1.0, 
      "transparent" : false, 
      "vertexColors" : false 
    } 

它的工作原理非常好。感谢你们。

回答

1

如果我正确查看了您的代码,running_babe.js是您正在讨论的网格。看着它的来源,该材料如下:

"materials" : [ { 
    "DbgColor" : 15658734, 
    "DbgIndex" : 0, 
    "DbgName" : "Material", 
    "blending" : "NormalBlending", 
    "colorAmbient" : [0.6400000190734865, 0.6400000190734865, 0.6400000190734865], 
    "colorDiffuse" : [0.6400000190734865, 0.6400000190734865, 0.6400000190734865], 
    "colorSpecular" : [0.5, 0.5, 0.5], 
    "depthTest" : true, 
    "depthWrite" : true, 
    "shading" : "Lambert", 
    "specularCoef" : 50, 
    "transparency" : 1.0, 
    "transparent" : false, 
    "vertexColors" : false 
}, 

{ 
    "DbgColor" : 15658734, 
    "DbgIndex" : 0, 
    "DbgName" : "default", 
    "vertexColors" : false 
}], 

可以清楚地看到,没有纹理,第二个没有真的什么,第一个具有所有颜色为灰色阴影。似乎材料未正确导出。这不是一个大的惊喜,因为出口材料很难,因为可能没有3D建模者概念和三维材料参数之间的明确映射。我只是通过在该文件中手动指定材料参数来修复它。

+0

非常感谢您指出这一点! – 2013-02-18 14:50:47

-1

每个网格物体都可以有一种材质,这就是OpenGL的工作原理。你确定你只有一个网格?

+0

好吧,它加载为一个单一的THREE.Mesh对象,但如果我选中“player.geometry.geometryGroupsList”,我会得到两个网格 - 一个用于头框,另一个用于body。 – 2013-02-18 12:20:52

+1

@bjorke - Three.js支持每个网格多种材质。它在内部将面分成组,以便最终它将为每种材质渲染一个几何,但从API的角度来看,支持多种材质。 – Tapio 2013-02-18 14:02:38

+0

Thx是为threee.js提供的单挑,@Tapio! – bjorke 2013-02-26 00:35:38