public Octree(Primatives.TriangleMesh Mesh, int MaxLevels) { Vector3[] maxmin = maxMin(Mesh); Vector3 max = maxmin[0]; Vector3 min = maxmin[1]; this.mesh = Mesh; this.maxDivisions = MaxLevels; center = (maxmin[0] + maxmin[1]) / 2; size = (maxmin[0] - maxmin[1]); }
Vector3[] maxMin(Primatives.TriangleMesh Mesh) { Vector3 max = Vector3.Zero; Vector3 min = Vector3.Zero; Vector3[] maxmin = new Vector3[2]; foreach (Primatives.Triangle Triangle in Mesh.Triangles) { for (int i = 0; i < 3; i++) { if (Triangle.Vertices[i].X > max.X) { max.X = Triangle.Vertices[i].X; } if (Triangle.Vertices[i].Y > max.Y) { max.Y = Triangle.Vertices[i].Y; } if (Triangle.Vertices[i].Z > max.Z) { max.Z = Triangle.Vertices[i].Z; } if (Triangle.Vertices[i].X < min.X) { min.X = Triangle.Vertices[i].X; } if (Triangle.Vertices[i].Y < min.Y) { min.Y = Triangle.Vertices[i].Y; } if (Triangle.Vertices[i].Z < min.Z) { min.Z = Triangle.Vertices[i].Z; } } } maxmin[0] = max; maxmin[1] = min; return(maxmin); }
public World(Model model) { int a = 1; for (int i = 0; i < numDivisions + 1; i++) { int numOcts = a; OctreeReferences[i] = new List <int> [numOcts]; a *= 8; } Dictionary <string, object> tagData = (Dictionary <string, object>)model.Tag; Vector3[] vertices = (Vector3[])tagData["Vertices"]; Primatives.Triangle[] triangles = new Primatives.Triangle[vertices.Length / 3]; int n = 0; for (int i = 0; i < vertices.Length;) { Vector3 v1 = vertices[i++]; Vector3 v2 = vertices[i++]; Vector3 v3 = vertices[i++]; triangles[n++] = new Primatives.Triangle(v1, v2, v3); } octree = new Octree(new Primatives.TriangleMesh(triangles), numDivisions); this.mesh = octree.OctTaggedMesh; for (int i = 0; i < mesh.Triangles.Length; i++) { int octlet = mesh.Triangles[i].OctTag[0]; int level = mesh.Triangles[i].OctTag[1]; if (OctreeReferences[level][octlet] == null) { OctreeReferences[level][octlet] = new List <int>(); } OctreeReferences[level][octlet].Add(i); } }
public World(Model model) { int a = 1; for (int i = 0; i < numDivisions + 1; i++) { int numOcts = a; OctreeReferences[i] = new List<int>[numOcts]; a *= 8; } Dictionary<string, object> tagData = (Dictionary<string, object>)model.Tag; Vector3[] vertices = (Vector3[])tagData["Vertices"]; Primatives.Triangle[] triangles = new Primatives.Triangle[vertices.Length / 3]; int n = 0; for (int i = 0; i < vertices.Length; ) { Vector3 v1 = vertices[i++]; Vector3 v2 = vertices[i++]; Vector3 v3 = vertices[i++]; triangles[n++] = new Primatives.Triangle(v1, v2, v3); } octree = new Octree(new Primatives.TriangleMesh(triangles), numDivisions); this.mesh = octree.OctTaggedMesh; for (int i = 0; i < mesh.Triangles.Length; i++) { int octlet = mesh.Triangles[i].OctTag[0]; int level = mesh.Triangles[i].OctTag[1]; if (OctreeReferences[level][octlet] == null) { OctreeReferences[level][octlet] = new List<int>(); } OctreeReferences[level][octlet].Add(i); } }