mesh-合并网格
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