From ab31e466e5aba6748159dc681bdb76bacfd707f9 Mon Sep 17 00:00:00 2001 From: conceptclear Date: Fri, 4 Dec 2020 14:59:56 +0800 Subject: [PATCH] add the test model and fix the problem mentioned in issue 7 --- src/cpu_voxelizer.cpp | 6 +++--- src/util.h | 6 +++--- src/voxelize.cu | 6 +++--- test_models/mechanical.STL | Bin 0 -> 55884 bytes 4 files changed, 9 insertions(+), 9 deletions(-) create mode 100755 test_models/mechanical.STL diff --git a/src/cpu_voxelizer.cpp b/src/cpu_voxelizer.cpp index af695d5..277735b 100644 --- a/src/cpu_voxelizer.cpp +++ b/src/cpu_voxelizer.cpp @@ -130,9 +130,9 @@ namespace cpu_voxelizer { n_zx_e1 = -n_zx_e1; n_zx_e2 = -n_zx_e2; } - float d_xz_e0 = (-1.0f * glm::dot(n_zx_e0, glm::vec2(v0.z, v0.x))) + glm::max(0.0f, info.unit.x * n_zx_e0[0]) + glm::max(0.0f, info.unit.z * n_zx_e0[1]); - float d_xz_e1 = (-1.0f * glm::dot(n_zx_e1, glm::vec2(v1.z, v1.x))) + glm::max(0.0f, info.unit.x * n_zx_e1[0]) + glm::max(0.0f, info.unit.z * n_zx_e1[1]); - float d_xz_e2 = (-1.0f * glm::dot(n_zx_e2, glm::vec2(v2.z, v2.x))) + glm::max(0.0f, info.unit.x * n_zx_e2[0]) + glm::max(0.0f, info.unit.z * n_zx_e2[1]); + float d_xz_e0 = (-1.0f * glm::dot(n_zx_e0, glm::vec2(v0.z, v0.x))) + glm::max(0.0f, info.unit.z * n_zx_e0[0]) + glm::max(0.0f, info.unit.x * n_zx_e0[1]); + float d_xz_e1 = (-1.0f * glm::dot(n_zx_e1, glm::vec2(v1.z, v1.x))) + glm::max(0.0f, info.unit.z * n_zx_e1[0]) + glm::max(0.0f, info.unit.x * n_zx_e1[1]); + float d_xz_e2 = (-1.0f * glm::dot(n_zx_e2, glm::vec2(v2.z, v2.x))) + glm::max(0.0f, info.unit.z * n_zx_e2[0]) + glm::max(0.0f, info.unit.x * n_zx_e2[1]); // test possible grid boxes for overlap for (int z = t_bbox_grid.min.z; z <= t_bbox_grid.max.z; z++) { diff --git a/src/util.h b/src/util.h index 222a87f..6135c02 100644 --- a/src/util.h +++ b/src/util.h @@ -102,9 +102,9 @@ inline AABox createMeshBBCube(AABox box) { // Suspected cause: If a triangle is axis-aligned and lies perfectly on a voxel edge, it sometimes gets counted / not counted // Probably due to a numerical instability (division by zero?) // Ugly fix: we pad the bounding box on all sides by 1/10001th of its total length, bringing all triangles ever so slightly off-grid - glm::vec3 epsilon = (answer.max - answer.min) / 10001.0f; - answer.min -= epsilon; - answer.max += epsilon; + // glm::vec3 epsilon = (answer.max - answer.min) / 10001.0f; + // answer.min -= epsilon; + // answer.max += epsilon; return answer; } diff --git a/src/voxelize.cu b/src/voxelize.cu index aac73c9..f30fa0a 100644 --- a/src/voxelize.cu +++ b/src/voxelize.cu @@ -128,9 +128,9 @@ __global__ void voxelize_triangle(voxinfo info, float* triangle_data, unsigned i n_zx_e1 = -n_zx_e1; n_zx_e2 = -n_zx_e2; } - float d_xz_e0 = (-1.0f * glm::dot(n_zx_e0, glm::vec2(v0.z, v0.x))) + glm::max(0.0f, info.unit.x*n_zx_e0[0]) + glm::max(0.0f, info.unit.z*n_zx_e0[1]); - float d_xz_e1 = (-1.0f * glm::dot(n_zx_e1, glm::vec2(v1.z, v1.x))) + glm::max(0.0f, info.unit.x*n_zx_e1[0]) + glm::max(0.0f, info.unit.z*n_zx_e1[1]); - float d_xz_e2 = (-1.0f * glm::dot(n_zx_e2, glm::vec2(v2.z, v2.x))) + glm::max(0.0f, info.unit.x*n_zx_e2[0]) + glm::max(0.0f, info.unit.z*n_zx_e2[1]); + float d_xz_e0 = (-1.0f * glm::dot(n_zx_e0, glm::vec2(v0.z, v0.x))) + glm::max(0.0f, info.unit.z*n_zx_e0[0]) + glm::max(0.0f, info.unit.x*n_zx_e0[1]); + float d_xz_e1 = (-1.0f * glm::dot(n_zx_e1, glm::vec2(v1.z, v1.x))) + glm::max(0.0f, info.unit.z*n_zx_e1[0]) + glm::max(0.0f, info.unit.x*n_zx_e1[1]); + float d_xz_e2 = (-1.0f * glm::dot(n_zx_e2, glm::vec2(v2.z, v2.x))) + glm::max(0.0f, info.unit.z*n_zx_e2[0]) + glm::max(0.0f, info.unit.x*n_zx_e2[1]); // test possible grid boxes for overlap for (int z = t_bbox_grid.min.z; z <= t_bbox_grid.max.z; z++){ diff --git a/test_models/mechanical.STL b/test_models/mechanical.STL new file mode 100755 index 0000000000000000000000000000000000000000..6b489e9cc758aa6cb99a3ca44eefd5900feff9c5 GIT binary patch literal 55884 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 b4Jc!5V0R+6_EGkC6)_@sx&-uel=1%oAS#k6 literal 0 HcmV?d00001