Multiple materials with JSONLoader?
是否可以将两种材质分配给一个使用 JSONLoader 加载的网格?
我在 blender 中制作了一个简单的字符并将其导出为 three.js 格式,其中包含变形目标和 UV。
我试图将纯色材质分配给身体,并将图片分配给角色的头部 (http://touhou.ru/dev/webgl-test-stackoverflow/kourindouhime.jpg),但在加载网格之后和材料我得到一个灰色的网格。
这里是我的项目的生产版本(使用 wasd 移动,当你看到你要控制的灰色播放器网格时,这正是我所说的):http: //touhou.ru/dev/webgl-test-stackoverflow/
这是我使用 JSONLoader 加载网格和材质的方式:
1 2 3 4 5 6 7 8 9 | 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); }); |
我是不是做错了什么?
更新:问题出在我的导出中。现在第二种材料看起来是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | { "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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | "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 建模器概念和 three.js 材料参数之间可能没有明确的映射。我只是通过手动将材料参数指定到该文件中来修复它。
每个网格可以有一种材质,这就是 OpenGL 的工作方式。你确定你只有一个网格吗?