mesh-合并网格

2021-12-14  本文已影响0人  skoll

var newMesh = BABYLON.Mesh.MergeMeshes(arrayOfMeshes, disposeSource, allow32BitsIndices, meshSubclass, subdivideWithSubMeshes, multiMultiMaterials)
1 .网格数组,一些将要合并起来的东西
2 .multiMultiMaterials:细分网格并接受多个材质
3 .disposeSource:源网格在合并之后将被处理
3 .let mesh=BABYLON.Mesh.MergeMeshes([leaves, trunk],true , false , null , false , true); 我们的例子

MultiMaterial 多材质

组合方式1

 var mat1 = new BABYLON.StandardMaterial('mat1', scene);
    mat1.diffuseColor = new BABYLON.Color3(1, 0, 0);
    
    var mat2 = new BABYLON.StandardMaterial('mat2', scene);
    mat2.diffuseColor = new BABYLON.Color3(0, 1, 0);


    var sphere = BABYLON.MeshBuilder.CreateSphere("sphere1", {diameter: 2, segments: 16}, scene);
    sphere.material = mat1;
    sphere.position.y = 1;

    var cube = BABYLON.MeshBuilder.CreateBox("cube", { size: 1, height: 3 }, scene);
    cube.position = new BABYLON.Vector3(1, 1.5, 0);
    cube.material = mat2;
var mesh = BABYLON.Mesh.MergeMeshes([sphere, cube], true, true, undefined, false, true);

1 .当您将网格合并在一起时,将最终参数multiMultiMultiMaterial设置为 true,子网格数组将自动与所有合并网格的子网格一起创建。每个 subMesh 的材质也包含在生成的网格的新 multiMaterial 中。此功能忽略参数 ( subdivideWithSubMeshes)。

结果 两种材质最后在粒子系统里面都显示不到

组合方式2

var leaves = BABYLON.Mesh.CreateTube("tube", curve, 0, 10, radiusFunction, 1, scene);
        var trunk = BABYLON.Mesh.CreateCylinder("trunk", nbS/nbL, nbL*1.5 - nbL/2 - 1, nbL*1.5 - nbL/2 - 1, 12, 1, scene);

        let multiMat=new BABYLON.MultiMaterial('multi',scene)
        multiMat.subMaterials.push(leafMaterial)
        multiMat.subMaterials.push(woodMaterial)

        let mesh=BABYLON.Mesh.MergeMeshes([leaves, trunk],true , true , null , false , true);
        mesh.material=multiMat
        mesh.subMeshes[1].materialIndex=1
        console.log(mesh.material)
        return mesh;

1 .当您将网格合并在一起并将倒数第二个参数 ( subdivideWithSubMeshes) 设置为 true,但最后一个参数 ( multiMultiMaterial) 保留为 false 时,将自动创建 subMeshes 数组,每个合并网格都作为新网格的子网格。您必须将正确的 subMesh 索引分配给正确的材料索引。

结果:材料2可以显示

1 .那结果又感觉是在粒子系统那里.其实就是最根本的就是渲染出来的mesh,和粒子里面的mesh的材质发生的对象有变化.
2 .合并完之后的tree实例,可以正常显示的打印出来的结构如下,关键是这里

1 .一个是subMesh属性,里面有两个合成前的mesh,里面的materialIndex用来读取对应的材质
2 .一个是subMaterial属性,使用的时候直接从这里找,这里感觉怎么有点不太对劲呢

3 .进入到sps里面的tree实例,以为会和外面的一样,但是实际上已经完全不一样了


截屏2021-12-14 上午12.02.22.png

4 .他的材料现在已经挂载到了整体的SPS上面,而不再自己身上了
5 .这里的材质可以用uv来实现,因为每一个是可以设置他自己的uv的

难道不能写在那个里面,需要这样做

var multimat = new BABYLON.MultiMaterial("multi", scene);
multimat.subMaterials.push(material0);
multimat.subMaterials.push(material1);
multimat.subMaterials.push(material2);

sps.mesh.material = multimat;
sps.computeSubMeshes();
//但是这样不就是所有的都用一个了么。。。

 SPS.mesh.material = mat;亲测这个是可以用的,但是还是不行啊

昨天最后发现的问题

1 .sps的materials里面保存的材料,是addShape的时候传入的每一个材料的material,也可以是后面单独加的,多addShape一个,就会多一个,他确实是一个multimal类型,但是他的multial是sps的多个材料,每一个粒子可以使用其中的一个
2 .而这里我想做的是给一个mesh用multial材质,然后让粒子里面使用这个,很明显现在不行
3 .第一个是合并之后的类型,其实并不是真正合并成了一个真正的mesh,材质也没有真的用上,合成的mesh,还是在subMesh里面存储着之前的mesh,使用的时候仅仅从这里拿到,然后渲染,单个是没问题的,不知道到了sps里面为啥不行
4 .而sps里面讲的多材质,从来都是指我们最一开始说的


截屏2021-12-14 下午10.46.39.png

5 .看起来就仅合并mesh来说,最后实现的效果都是一样的,并没有真正的有本质的区别,最后合成的数据结构是一样的,都有subMesh,都有material

上一篇下一篇

猜你喜欢

热点阅读