private static CollisionShape loadConvexHull(Mesh mesh, Vector3 scale) { TriangleMesh trimesh = new TriangleMesh(); // Shift vertices in so margin is not visible Vector3 shift = Vector3.Normalize(scale) - new Vector3(0.04f); for (int i = 0; i < mesh.submeshes[0].vertex_data.Length; i += 3) { int index0 = (int)mesh.submeshes[0].index_data[i]; int index1 = (int)mesh.submeshes[0].index_data[i + 1]; int index2 = (int)mesh.submeshes[0].index_data[i + 2]; Vector3 vertex0 = new Vector3(mesh.submeshes[0].vertex_data[index0].position.X, mesh.submeshes[0].vertex_data[index0].position.Y, mesh.submeshes[0].vertex_data[index0].position.Z) * (scale); //vertex0 *= shift; Vector3 vertex1 = new Vector3(mesh.submeshes[0].vertex_data[index1].position.X, mesh.submeshes[0].vertex_data[index1].position.Y, mesh.submeshes[0].vertex_data[index1].position.Z) * (scale); //vertex1 *= shift; Vector3 vertex2 = new Vector3(mesh.submeshes[0].vertex_data[index2].position.X, mesh.submeshes[0].vertex_data[index2].position.Y, mesh.submeshes[0].vertex_data[index2].position.Z) * (scale); //vertex2 *= shift; trimesh.AddTriangle(vertex0, vertex1, vertex2); } ConvexShape tmpShape = new ConvexTriangleMeshShape(trimesh); ShapeHull hull = new ShapeHull(tmpShape); float margin = tmpShape.Margin; hull.BuildHull(margin); tmpShape.UserObject = hull; ConvexHullShape convexShape = new ConvexHullShape(); foreach (Vector3 v in hull.Vertices) { convexShape.AddPoint(v); } hull.Dispose(); tmpShape.Dispose(); return(convexShape); }
public static Vector3[] CreateConvexHull(ConvexHullShape shape) { var hull = new ShapeHull(shape); hull.BuildHull(shape.Margin); int vertexCount = hull.NumIndices; UIntArray indices = hull.Indices; Vector3Array points = hull.Vertices; var vertices = new Vector3[vertexCount * 2]; int v = 0; for (int i = 0; i < vertexCount; i += 3) { Vector3 v0 = points[(int)indices[i]]; Vector3 v1 = points[(int)indices[i + 1]]; Vector3 v2 = points[(int)indices[i + 2]]; Vector3 v01 = v0 - v1; Vector3 v02 = v0 - v2; Vector3 normal = Vector3.Cross(v01, v02); normal.Normalize(); vertices[v++] = v0; vertices[v++] = normal; vertices[v++] = v1; vertices[v++] = normal; vertices[v++] = v2; vertices[v++] = normal; } hull.Dispose(); return(vertices); }