private void CreateVoxelizedMesh() { selectedObject = (Selection.activeObject != null) ? (GameObject)Selection.activeObject : null; Mesh mesh; MeshFilter meshFilter = selectedObject.GetComponent <MeshFilter>(); if (meshFilter != null) { mesh = meshFilter.sharedMesh; } else { mesh = selectedObject.GetComponent <SkinnedMeshRenderer>().sharedMesh; } List <Voxel_t> voxels; CPUVoxelizer.Voxelize( mesh, // a target mesh resolution, // # of voxels for largest AABB bounds out voxels, out float unit ); // build voxel cubes integrated mesh GameObject parent = new GameObject("Voxelized"); parent.AddComponent <MeshRenderer>(); parent.GetComponent <MeshFilter>().sharedMesh = VoxelMesh.Build(voxels.ToArray(), unit, useUv); }
private void CreateVoxelizedMultibody() { selectedObject = (Selection.activeObject != null) ? (GameObject)Selection.activeObject : null; Mesh mesh; MeshFilter meshFilter = selectedObject.GetComponent <MeshFilter>(); if (meshFilter != null) { mesh = meshFilter.sharedMesh; } else { mesh = selectedObject.GetComponent <SkinnedMeshRenderer>().sharedMesh; } List <Voxel_t> voxels; CPUVoxelizer.Voxelize( mesh, // a target mesh resolution, // # of voxels for largest AABB bounds out voxels, out float unit ); // build gameobject with individual, colliding voxel cube objects Material material = selectedObject.GetComponent <MeshRenderer>().sharedMaterial; GameObject go = VoxelMesh.BuildObject(voxels.ToArray(), unit, material, folderName, useUv); go.GetComponent <MeshRenderer>().material = material; }
Mesh Voxelize(Mesh source) { List <Voxel_t> voxels; float size; CPUVoxelizer.Voxelize(source, resolution, out voxels, out size, surfaceOnly); return(VoxelMesh.Build(voxels.ToArray(), size)); }
void Start() { voxels = CPUVoxelizer.Voxelize(mesh, count); voxels.ForEach(voxel => { var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); cube.transform.parent = transform; cube.transform.localPosition = voxel.position; cube.transform.localScale = voxel.size * Vector3.one; cube.transform.localRotation = Quaternion.identity; }); }
void Start() { List <Voxel_t> voxels; float unit; CPUVoxelizer.Voxelize(mesh, resolution, out voxels, out unit); var filter = GetComponent <MeshFilter>(); filter.sharedMesh = VoxelMesh.Build(voxels.ToArray(), unit, useUV); }
public void Generate() { Clear(); Setup(transform); if (Resolution == 0) { return; } if (Combine) { List <Voxel_t> voxels; float unit; CPUVoxelizer.Voxelize(ComputeMesh(), Resolution, out voxels, out unit); List <BoxCollider> colliders = new List <BoxCollider>(); for (int i = 0; i < voxels.Count; i++) { BoxCollider c = GetColliders().gameObject.AddComponent <BoxCollider>(); c.center = voxels[i].position; c.size = new Vector3(unit, unit, unit); colliders.Add(c); } if (Optimise) { FilterVoxels(colliders, Axis.XPositive); FilterVoxels(colliders, Axis.YPositive); FilterVoxels(colliders, Axis.ZPositive); } } else { foreach (MeshFilter filter in GetComponentsInChildren <MeshFilter>()) { Matrix4x4 delta = filter.transform.parent == null ? Matrix4x4.identity : filter.transform.parent.GetWorldMatrix().GetRelativeTransformationTo(transform.GetWorldMatrix()); List <Voxel_t> voxels; float unit; CPUVoxelizer.Voxelize(filter.sharedMesh, Resolution, out voxels, out unit); List <BoxCollider> colliders = new List <BoxCollider>(); for (int i = 0; i < voxels.Count; i++) { BoxCollider c = GetColliders().gameObject.AddComponent <BoxCollider>(); c.center = voxels[i].position.GetRelativePositionFrom(delta); c.size = new Vector3(unit, unit, unit); colliders.Add(c); } if (Optimise) { FilterVoxels(colliders, Axis.XPositive); FilterVoxels(colliders, Axis.YPositive); FilterVoxels(colliders, Axis.ZPositive); } } } CalculateBounds(); }
void Start() { Measure(() => { List <Voxel_t> voxels; float unit; CPUVoxelizer.Voxelize(source, resolution, out voxels, out unit); }, iterations); Measure(() => { var data = GPUVoxelizer.Voxelize(voxelizer, source, resolution); data.Dispose(); }, iterations); }
public void VoxelizeHull() { Mesh mesh = _Hull.sharedMesh; // Apply transform to the hull mesh Matrix4x4 mat = this.transform.worldToLocalMatrix * _Hull.gameObject.transform.localToWorldMatrix; Vector3[] transformedVertices = mesh.vertices; for (int i = 0; i < transformedVertices.Length; i++) { transformedVertices[i] = mat.MultiplyPoint3x4(transformedVertices[i]); } Mesh transformedMesh = new Mesh(); transformedMesh.vertices = transformedVertices; transformedMesh.triangles = mesh.triangles; transformedMesh.normals = mesh.normals; // Voxelize the mesh List <Voxel_t> voxels; CPUVoxelizer.Voxelize(transformedMesh, _VoxelResolution, out voxels, out float voxelSize); SymmetrizeVoxels(voxels); // Save voxels to samples Vector3 sampleCenter = Vector3.zero; _samplePositions.Clear(); foreach (Voxel_t voxel in voxels) { _samplePositions.Add(voxel.position); sampleCenter += voxel.position; } // Save sample radius and center _sampleRadius = voxelSize * _SampleSizeMultiplier * 2.4f; sampleCenter /= _samplePositions.Count; _Rigidbody.centerOfMass = transform.worldToLocalMatrix.MultiplyPoint3x4(sampleCenter); // Calculate average length along axis transformedMesh.RecalculateBounds(); Vector3 size = transformedMesh.bounds.size; _AverageWidth = (size.x + size.y + size.z) / 3f; }
public void Generate() { Clear(); Setup(transform); if (Resolution == 0) { return; } if (Combine) { List <Voxel_t> voxels; float unit; CPUVoxelizer.Voxelize(ComputeMesh(), Resolution, out voxels, out unit); List <BoxCollider> colliders = new List <BoxCollider>(); for (int i = 0; i < voxels.Count; i++) { BoxCollider c = GetContainer().gameObject.AddComponent <BoxCollider>(); c.center = voxels[i].position; c.size = new Vector3(unit, unit, unit); colliders.Add(c); } if (Optimise) { FilterVoxels(colliders, Axis.XPositive); FilterVoxels(colliders, Axis.YPositive); FilterVoxels(colliders, Axis.ZPositive); } } else { foreach (MeshFilter filter in GetComponentsInChildren <MeshFilter>()) { List <Voxel_t> voxels; float unit; CPUVoxelizer.Voxelize(filter.sharedMesh, Resolution, out voxels, out unit); List <BoxCollider> colliders = new List <BoxCollider>(); for (int i = 0; i < voxels.Count; i++) { BoxCollider c = GetContainer().gameObject.AddComponent <BoxCollider>(); c.center = (transform.worldToLocalMatrix * filter.transform.localToWorldMatrix).MultiplyPoint3x4(voxels[i].position); c.size = new Vector3(unit, unit, unit); colliders.Add(c); } if (Optimise) { FilterVoxels(colliders, Axis.XPositive); FilterVoxels(colliders, Axis.YPositive); FilterVoxels(colliders, Axis.ZPositive); } } } { BoundsMin = Vector3.zero; BoundsMax = Vector3.zero; BoxCollider[] colliders = GetColliders(); foreach (BoxCollider c in colliders) { BoundsMin = Vector3.Min(BoundsMin, c.center - 0.5f * c.size); BoundsMax = Vector3.Max(BoundsMax, c.center + 0.5f * c.size); } } }