Use multiple materials for merged geometries in Three.js

前端 未结 2 1118
猫巷女王i
猫巷女王i 2021-01-01 01:19

I want to create a Pine using 2 meshes, 1 for the trunk and another one for the bush, this what I\'ve done:

var pine_geometry = new THREE.Geometry();

var pi         


        
2条回答
  •  一向
    一向 (楼主)
    2021-01-01 01:52

    Here's a general function to merge meshes with materials, You can also specify if you want it to return it as a buffer geometry.

    function _mergeMeshes(meshes, toBufferGeometry) {
    
        var finalGeometry,
            materials = [],
            mergedGeometry = new THREE.Geometry(),
            mergeMaterial,
            mergedMesh;
    
        meshes.forEach(function(mesh, index) {
            mesh.updateMatrix();
            mesh.geometry.faces.forEach(function(face) {face.materialIndex = 0;});
            mergedGeometry.merge(mesh.geometry, mesh.matrix, index);
            materials.push(mesh.material);
        });
    
        mergedGeometry.groupsNeedUpdate = true;
        mergeMaterial = new THREE.MeshFaceMaterial(materials);
    
        if (toBufferGeometry) {
            finalGeometry = new THREE.BufferGeometry().fromGeometry(mergedGeometry);
        } else {
            finalGeometry = mergedGeometry;
        }
    
        mergedMesh = new THREE.Mesh(finalGeometry, mergeMaterial);
        mergedMesh.geometry.computeFaceNormals();
        mergedMesh.geometry.computeVertexNormals();
    
        return mergedMesh;
    
    }
    
    var mergedMesh = _mergeMeshes([trunkMesh, treeTopMesh], true);
    

提交回复
热议问题