我在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就会加载纹理而不是材质,但我无法用它来实现镜面高光。那。
答案 0 :(得分:2)
解决方案是将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
素材。看看脚本源代码,看看你是否可以搞清楚。