trimeshToPolyhedron static method

Body trimeshToPolyhedron(
  1. Trimesh trimesh,
  2. Body body, [
  3. 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;
}