ThreeJS使用独特材质合并多个网格

时间:2015-09-25 05:21:57

标签: javascript three.js

我不知道我做错了什么。我有多个网格,我试图合并到一个网格,以便我可以节省绘制调用。 我的每个网格都有独特的材质。在这个例子中,它只有不同的颜色,但实际上它们将映射出独特的纹理。

这是我的代码:

        materials = [];
        blocks = [];
        var tempMat;
        var tempCube;
        var tempGeo;
        var tempvec;


        // block 1
        tempMat = new THREE.MeshLambertMaterial({ color: '0x0000ff' });
        materials.push( tempMat );
        tempGeo = new THREE.CubeGeometry(1, 1, 1);
        for (var ix=0; ix<tempGeo.faces.length; ix++) {
                tempGeo.faces[ix].materialIndex = 0;
        }
        tempCube = new THREE.Mesh( tempGeo, tempMat );
        tempCube.position.set(0, 3, -6);
        blocks.push( tempCube );


        // block 2
        tempMat = new THREE.MeshLambertMaterial({ color: '0x00ff00' });
        materials.push( tempMat );
        tempGeo = new THREE.CubeGeometry(1, 1, 1);
        for (var ix=0; ix<tempGeo.faces.length; ix++) {
                tempGeo.faces[ix].materialIndex = 1;
        }
        tempCube = new THREE.Mesh( tempGeo, tempMat );
        tempCube.position.set(1, 3, -6);
        blocks.push( tempCube );


        // Merging them all into one
        var geo = new THREE.Geometry();
        for (var i=0; i<blocks.length; i++) {
            blocks[i].updateMatrix();
            geo.merge(blocks[i].geometry, blocks[i].matrix, i);
        }
        var newmesh = new THREE.Mesh( geo, new THREE.MeshFaceMaterial( materials ) );
        scene.add(newmesh);

基本上,这给了我一个错误,上面写着: 未捕获的TypeError:无法读取未定义的属性“可见” 每次调用我的渲染函数。

我哪里出错了?

1 个答案:

答案 0 :(得分:2)

您正在将几何合并为一个,并使用MeshFaceMaterial(在r.72中重命名为MultiMaterial)。

合并具有不同材质索引的几何图形没有任何意义。

WebGLRenderer需要按材质对几何图形进行分割以进行渲染。

根据经验法则,只有合并几何形状(如果它们将使用单一材质渲染)。

three.js r.72