trimeshToPolyhedron static method
Body
trimeshToPolyhedron(
- Trimesh trimesh,
- Body body, [
- Vector3? upvector
])
Implementation
static Body trimeshToPolyhedron(Trimesh trimesh,Body body, [Vector3? upvector]){
final p1 = Vector3.zero();
final p2 = Vector3.zero();
final p3 = Vector3.zero();
final p4 = Vector3.zero();
final mp = Vector3.zero();
final tmp = Vector3.zero();
final e1 = Vector3.zero();
final e2 = Vector3.zero();
for(int i = 0; i < trimesh.indices.length/3;i++){
mp.setValues(0,0,0);
trimesh.getTriangleVertices(i,p1,p2,p3);
trimesh.getIndicesNormal(i,p4);
if(upvector != null && p4.dot(upvector) < 0){
p4.scale2(-1,p4);
}
p4.normalize();
mp..add(p1)..add(p2)..add(p3)..scale(1/3);
final List<Vector3> vertices = [Vector3.copy(p1),Vector3.copy(p2),Vector3.copy(p3),mp..add(Vector3.copy(p4)..scale(-1))];
final faces = [[0,1,2],[0,3,1],[1,3,2],[2,3,0]];
final List<Vector3> normals = [Vector3.copy(p4)];
for(int j = 0;j < 3;j++){
vertices[j].sub2(vertices[(j+1)%3],e1);
vertices[(j+1)%3].sub2(p4,e2);
tmp.setValues(1,1,1);
final points = faces[j+1];
for(int p = 0;p < points.length;p++){
tmp.add2(vertices[points[p]],tmp);
}
tmp.scale2(1/points.length,tmp);
final normal = e1.cross(e2);
normal.normalize();
normal.scale2(-1,normal);
final angle = normal.dot(tmp);
if(angle <= 0 ){
normal.scale2(-1,normal);
}
normals.add(normal);
}
final polyhedron = ConvexPolyhedron(
vertices:vertices,
faces:faces,
normals:normals
);
body.addShape(polyhedron);
}
return body;
}