【问题标题】:Three js, loading texture to only specific mtl三个js,只将纹理加载到特定的mtl
【发布时间】:2015-07-27 06:12:07
【问题描述】:

我正在使用 OBJMTLLoader 加载 obj 和 mtl 文件。对象中有多种材料。我想要的是将纹理应用于对象内的特定材质。

例如。我有一个 Bag 对象,它有 Handle、Brand name、Wheels 作为不同的材料。我想为它们中的每一个添加不同的纹理。材质文件中不会出现纹理。我只想使用代码添加它。

<pre>
    var loader = new THREE.OBJMTLLoader();
    loader.load( 'obj/Test.obj', 'obj/Test.mtl', function ( object ) {

    var tex = new THREE.MeshLambertMaterial({map:THREE.ImageUtils.loadTexture(     'obj/texture.png')});

    object.traverse( function(child) {
    if (child instanceof THREE.Mesh) {
    // apply custom material
    child.material = tex;

    // enable casting shadows
    child.castShadow = true;
    child.receiveShadow = true;
    }
    });
</pre>

【问题讨论】:

  • 为此,我会先加载纹理,然后再加载模型(即,将 loader.load 函数放入 loadTexture 回调中)。您还需要一个测试(您的代码将适用于所有网格)。但是对于一个独特的文件,我只需将纹理添加到 .MTL 中(只需将 'map_Ka path/textureimage.jpg' 添加到材质定义中),至少如果我不需要控制包装参数...

标签: three.js


【解决方案1】:

您可以通过检查您在 mtl 文件中写入的材质名称然后分配纹理来做到这一点。

您的 .mtl 文件如下所示:

newmtl wheels
Ka  1.0 1.0 1.0
Kd  1.0 1.0 1.0
d  1.0
# ...

在代码中:

var wheelsTexture = THREE.ImageUtils.loadTexture('obj/wheelTexture.png');

object.traverse( function(child) {
    if (child instanceof THREE.Mesh) {
        if ( child.material.name === "wheels" ) {

            child.material.map = wheelsTexture;

        } else if ( child.material.name === "handle" ) {
            // ...
        }
    }
} );

【讨论】:

    猜你喜欢
    • 2020-07-05
    • 1970-01-01
    • 2016-05-06
    • 2017-09-11
    • 2015-08-31
    • 1970-01-01
    • 2018-04-04
    • 2012-09-15
    • 2015-01-07
    相关资源
    最近更新 更多