【问题标题】:Specular highlights with a model imported from Blender?从 Blender 导入模型的镜面高光?
【发布时间】:2012-09-14 02:31:49
【问题描述】:

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

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

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

这里是sn-p的代码:

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

【问题讨论】:

    标签: three.js


    【解决方案1】:

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

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

    【讨论】:

    • 这里不是聊天的地方。是为了解答。请参阅下面我的答案下的 cmets。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • THREE.MeshFaceMaterial() 只是一种“通过”材质,当材质实际上是几何体的一部分时使用。
    猜你喜欢
    • 2021-04-09
    • 1970-01-01
    • 2019-10-04
    • 2021-04-22
    • 2017-03-26
    • 2020-07-24
    • 2015-12-01
    • 2014-06-03
    • 2016-10-09
    相关资源
    最近更新 更多