Exemple #1
0
	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);
	}
Exemple #2
0
    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);
    }