2

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

这可以很好地加载模型,两种不同颜色的材料正确显示。但我的问题是,我希望骰子在表面上有高光。这甚至可以通过导出的 Blender 模型实现吗?

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

这是代码片段:

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 加载纹理而不是材质,但我也无法实现镜面高光。

4

2 回答 2

2

Thx West,您为我指明了正确的方向。问题是,Blender 的标准材质类型是 Lambert。在 Blender 中,这种 Lambert 材质会产生所需的镜面高光,但一旦导入到三个,效果就消失了。我不知道这是错误还是期望的行为。

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

于 2012-09-22T12:15:46.933 回答
1

如果您的网格几何体有一个materials数组,您可以在加载几何体后随时更改数组元素:

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

然后,您将网格的材质保留为MeshFaceMaterial

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

您使用的导出器脚本可能会根据您的设置默认设置geometry.materials为材质。Lambert看看脚本源代码,看看你能不能弄清楚。

于 2012-09-21T17:59:03.917 回答