Javascript 使用唯一材质合并多个网格的ThreeJS

Javascript 使用唯一材质合并多个网格的ThreeJS,javascript,three.js,Javascript,Three.js,我不知道我做错了什么。我有多个网格,我正试图合并成一个网格,以便我可以保存绘制调用。 我的每个网格都有唯一的材质。在这个例子中,它只是有一个不同的颜色,但实际上他们将有独特的纹理映射 这是我的代码: materials = []; blocks = []; var tempMat; var tempCube; var tempGeo; var tempvec; // block 1

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

这是我的代码:

        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);
materials=[];
区块=[];
var tempMat;
var tempCube;
var tempGeo;
var tempvec;
//第一区
tempMat=new THREE.MeshLambertMaterial({color:'0x0000ff'});
材料.推(tempMat);
tempGeo=新的三立方测量法(1,1,1);

对于(var ix=0;ix您正在将几何图形合并为一个几何图形,并使用
MeshFaceMaterial
(在r.72中重命名为
MultiMaterial

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

WebGLRenderer
需要按材质分割几何体以进行渲染

根据经验,仅当几何体将使用单个材质渲染时,才合并几何体


three.js r.72

您可以自己调试。(1)Geometry.merge()
的第三个参数是偏移量,在您的情况下应该为零。(2)指定不带引号的十六进制颜色:
three.MeshLambertMaterial({color:0x00ff00})
--但不要做你正在做的事情。请看答案。所以,如果我有10000个立方体,每个立方体都有不同的纹理,那么一定会有10000个绘制调用?看,这就是我试图做的:我需要能够有100000多个立方体。有人建议将它们分组。所以我打算组合10x10组块它使用这种方法。但听起来你好像在说我不能。那么我的选择是什么呢!?如果我不能拥有超过10000个区块而不停在3fps,我怎么能创建一个完整的minecraft世界。对不起,我不能为你设计代码。我建议你看看这三个.js minecraft示例,它们都是通过一次绘制实现的呼叫