从Blender导入模型的镜面高光?

时间:2012-09-21 16:26:44

标签: three.js material

我在Dice中使用2种不同颜色的材料在Blender中制作并将其与Blender导出器一起导出。在我的three.js代码中,我使用JSONLoader获取网格并使用新的THREE.MeshFaceMaterial();作为材料。

这样可以正确加载模型,两种不同颜色的材料正确显示。但我的问题是,我希望骰子在表面上有镜面高光。导出的Blender型号是否可以实现这一点?

当我使用THREE.MeshPhongMaterial()作为球体的材质时,我设法获得了一个具有镜面高光的球体,但球体不是从Blender导入的,据我所知,我不能应用Phong材质当我用JSONLoader加载Mesh时,还是有诀窍?请记住:我在骰子上有两种不同颜色的材料,我从JSON文件中的Blender导入。骰子本身是红色的,但点应该是黑色的。所以我不是在谈论立方体左右两侧的不同颜色,而是在立方体的每一面都有两种不同的颜色。你能救我吗?

以下是代码段:

loader.load("models/dice.js", function(geometry){
    var material = new THREE.MeshFaceMaterial();
    material.specular = 0xffffff;
    material.shininess = 10000000000;
    dice=new THREE.Mesh(geometry, material);
    dice.position.set(0,-400,5);
    dice.scale.set(75, 75, 75);
    dice.overdraw = true;
    dice.name="dice";
    navscene.add(dice);
});

如果有帮助,我可以用两种材质创建一个纹理并将它们应用到Blender中,这样JSONLoader就会加载纹理而不是材质,但我无法用它来实现镜面高光。那。

2 个答案:

答案 0 :(得分:2)

西部,你把我指向了正确的方向。问题是,Blender的标准材料类型是Lambert。在Blender中,这种Lambert材质产生了所需的镜面高光,但一旦导入到三个,效果就消失了。我不知道这是一个错误,还是一个想要的行为。

解决方案是将Blender中的材质类型设置为Phong材质。即使在导入后也能正常工作我的猜测是,THREE.MeshFaceMaterial是一个包含所有加载材料的数组,无论它们是lambert,phong还是其他什么。甚至可以混合这些材料类型。所以在我看来,THREE.MeshFaceMaterial似乎根本不是一个“独立”的材料类型。如果我错了请纠正我。

答案 1 :(得分:1)

如果网格几何体具有materials数组,则可以在加载几何体后始终更改数组元素:

geometry.materials[ i ] = new THREE.MeshPhongMaterial( ... );

然后将网格物体的材质保留为MeshFaceMaterial

mesh = new THREE.mesh( geometry, new THREE.MeshFaceMaterial() );

您使用的导出器脚本默认情况下会根据您的设置将geometry.materials设置为Lambert素材。看看脚本源代码,看看你是否可以搞清楚。