简单说下自己的思路吧,就是把模型网格切割成若干个三角面生成新的网格数据再拼成原来的样子然后进行移动。因为基本都是js完成的,所以性能低下只能看看,没啥实用性。
start () {
// [3]
let r = utils.readMesh(this.node.getComponent(MeshRenderer)!.mesh!);
let faceArr = this.division(r);
for (let i = 0; i < faceArr.length; i++) {
let node = instantiate(this.pre);
node.getComponent(MeshRenderer)!.mesh = utils.createMesh(faceArr[i].r);
node.getComponent(Move)!.point = faceArr[i].pos;
this.node.parent?.addChild(node);
node.setPosition(this.node.position);
}
this.node.destroy();
}
division (r: primitives.IGeometry) {
let positionsArr = [];
for (let i = 0; i < r.positions.length / 3; i++) {
let t = i * 3;
positionsArr.push(v3(r.positions[t], r.positions[t + 1], r.positions[t + 2]));
}
let normalsArr = [];
for (let i = 0; i < r.normals!.length / 3; i++) {
let t = i *3;
normalsArr.push(v3(r.normals![t], r.normals![t + 1], r.normals![t + 2]));
}
let uvsArr = [];
for (let i = 0; i < r.uvs!.length / 2; i++) {
let t = i * 2;
uvsArr.push(v2(r.uvs![t], r.uvs![t + 1]));
}
let posArr = [];
for (let i = 0; i < r.indices!.length; i++) {
posArr.push({pos: positionsArr[r.indices![i]], normal: normalsArr[r.indices![i]], uvs: uvsArr[r.indices![i]]});
}
let faceArr = [];
for (let i = 0; i < posArr.length / 3; i++) {
let t = i * 3;
let a = v3(posArr[t].pos).subtract(posArr[t + 1].pos);
let b = v3(posArr[t + 2].pos).subtract(posArr[t + 1].pos);
let normal = b.cross(a).normalize();
faceArr.push({normal: normal, face: [posArr[t].pos, posArr[t + 1].pos, posArr[t + 2].pos], faceNormals: [posArr[t].normal, posArr[t + 1].normal, posArr[t + 2].normal], faceUvs: [posArr[t].uvs, posArr[t + 1].uvs, posArr[t + 2].uvs]});
}
r.positions = [];
r.normals = [];
r.indices = [];
r.uvs = [];
let rArr = [];
for (let i = 0; i < faceArr.length; i++) {
let temp = faceArr[i];
let rTemp = instantiate(r);
let pos = temp.face;
for (let j = 0; j < temp.face.length; j++) {
let tempPos = temp.face[j];
rTemp.positions.push(tempPos.x, tempPos.y, tempPos.z);
}
for (let j = 0; j < temp.faceNormals.length; j++) {
let tempNor = temp.faceNormals[j];
rTemp.normals!.push(tempNor.x, tempNor.y, tempNor.z);
}
for (let j = 0; j < temp.faceUvs.length; j++) {
let tempUvs = temp.faceUvs[j];
rTemp.uvs!.push(tempUvs.x, tempUvs.y);
}
rTemp.indices = [0, 1, 2];
rArr.push({r: rTemp, pos: pos});
}
return rArr;
// let tP = [], tN = [], tI = [], tUvs = [];
// for (let i = 0; i < posArr.length; i++) {
// const element = posArr[i];
// tP.push(element.pos.x);
// tP.push(element.pos.y);
// tP.push(element.pos.z);
// tN.push(element.normal.x);
// tN.push(element.normal.y);
// tN.push(element.normal.z);
// tI.push(i);
// tUvs.push(element.uvs.x);
// tUvs.push(element.uvs.y);
// }
// r.positions = tP;
// r.normals = tN;
// r.indices = tI;
// r.uvs = tUvs;
// return faceArr;
}
希望大佬们有更好的思路可以指点一二