public void Voxelize (Transform root) { var meshFilters = root.GetComponentsInChildren<MeshFilter>(); var objectBounds = new List<BoundHierarchy>(); foreach (var filter in meshFilters) { var mesh = filter.sharedMesh; var vertices = mesh.vertices; var tris = mesh.triangles; var triangleBounds = new List<BoundHierarchy>(); for(int i = 0; i < tris.Length; i += 3) { var vert1 = vertices[tris[i + 0]]; var vert2 = vertices[tris[i + 1]]; var vert3 = vertices[tris[i + 2]]; vert1 = filter.transform.TransformPoint(vert1); vert2 = filter.transform.TransformPoint(vert2); vert3 = filter.transform.TransformPoint(vert3); var u = vert2 - vert3; var v = vert3 - vert1; var triNormal = Vector3.Cross(u, v); triNormal = triNormal.normalized; var triBounds = new Bounds(vert1, Vector3.zero); triBounds.Encapsulate(vert2); triBounds.Encapsulate(vert3); var tri = new Triangle { vertA = vert1, vertB = vert2, vertC = vert3, normal = triNormal, bound = triBounds, }; triangleBounds.Add(new BoundHierarchy() { bound = triBounds, subBounds = null, triList = tri }); } objectBounds.Add(new BoundHierarchy() { bound = filter.GetComponent<Renderer>().bounds, subBounds = triangleBounds.ToArray() }); } var rootNode = new BoundHierarchy() { bound = _bounds, subBounds = objectBounds.ToArray() }; GenerateBlockArray (); GenerateVoxelData (rootNode); }
public void Voxelize(Transform root) { var meshFilters = root.GetComponentsInChildren <MeshFilter>(); var objectBounds = new List <BoundHierarchy>(); foreach (var filter in meshFilters) { var mesh = filter.sharedMesh; var vertices = mesh.vertices; var tris = mesh.triangles; var triangleBounds = new List <BoundHierarchy>(); for (int i = 0; i < tris.Length; i += 3) { var vert1 = vertices[tris[i + 0]]; var vert2 = vertices[tris[i + 1]]; var vert3 = vertices[tris[i + 2]]; vert1 = filter.transform.TransformPoint(vert1); vert2 = filter.transform.TransformPoint(vert2); vert3 = filter.transform.TransformPoint(vert3); var u = vert2 - vert3; var v = vert3 - vert1; var triNormal = Vector3.Cross(u, v); triNormal = triNormal.normalized; var triBounds = new Bounds(vert1, Vector3.zero); triBounds.Encapsulate(vert2); triBounds.Encapsulate(vert3); var tri = new Triangle { vertA = vert1, vertB = vert2, vertC = vert3, normal = triNormal, bound = triBounds, }; triangleBounds.Add(new BoundHierarchy() { bound = triBounds, subBounds = null, triList = tri }); } objectBounds.Add(new BoundHierarchy() { bound = filter.GetComponent <Renderer>().bounds, subBounds = triangleBounds.ToArray() }); } var rootNode = new BoundHierarchy() { bound = _bounds, subBounds = objectBounds.ToArray() }; GenerateBlockArray(); GenerateVoxelData(rootNode); }