partially fix MeshReconstruction
This commit is contained in:
parent
a9e0f9612b
commit
6cb0dbc21e
BIN
external/MeshReconstruction/.DS_Store
vendored
BIN
external/MeshReconstruction/.DS_Store
vendored
Binary file not shown.
@ -1,7 +1,5 @@
|
||||
add_library(MeshReconstruction MeshReconstruction.h MeshReconstruction.cpp Cube.h Cube.cpp DataStructs.h IO.h IO.cpp Triangulation.h Triangulation.cpp)
|
||||
|
||||
target_link_libraries(MeshReconstruction m)
|
||||
|
||||
install(TARGETS MeshReconstruction
|
||||
RUNTIME DESTINATION bin
|
||||
LIBRARY DESTINATION lib
|
||||
|
15
external/MeshReconstruction/lib/Cube.cpp
vendored
15
external/MeshReconstruction/lib/Cube.cpp
vendored
@ -1,5 +1,4 @@
|
||||
#include "Cube.h"
|
||||
#include <cmath>
|
||||
|
||||
using namespace MeshReconstruction;
|
||||
|
||||
@ -44,7 +43,7 @@ namespace
|
||||
|
||||
struct Edge
|
||||
{
|
||||
int edgeFlag : 12; // flag: 1, 2, 4, ... 2048
|
||||
unsigned edgeFlag : 12; // flag: 1, 2, 4, ... 2048
|
||||
int vert0; // 0-7
|
||||
int vert1; // 0-7
|
||||
};
|
||||
@ -74,9 +73,9 @@ Vec3 Cube::LerpVertex(double isoLevel, int i1, int i2) const
|
||||
auto const& p1 = pos[i1];
|
||||
auto const& p2 = pos[i2];
|
||||
|
||||
if (abs(isoLevel - v1) < Eps) return p1;
|
||||
if (abs(isoLevel - v2) < Eps) return p2;
|
||||
if (abs(v1 - v2) < Eps) return p1;
|
||||
if (std::abs(isoLevel - v1) < Eps) return p1;
|
||||
if (std::abs(isoLevel - v2) < Eps) return p2;
|
||||
if (std::abs(v1 - v2) < Eps) return p1;
|
||||
|
||||
auto mu = (isoLevel - v1) / (v2 - v1);
|
||||
return p1 + (p2 - p1)*mu;
|
||||
@ -117,7 +116,7 @@ int Cube::SignConfig(double isoLevel) const
|
||||
{
|
||||
if (sdf[i] < isoLevel)
|
||||
{
|
||||
edgeIndex |= 1 << i;
|
||||
edgeIndex |= (1 << i);
|
||||
}
|
||||
}
|
||||
|
||||
@ -133,10 +132,10 @@ IntersectInfo Cube::Intersect(double iso) const
|
||||
|
||||
IntersectInfo intersect;
|
||||
intersect.signConfig = SignConfig(iso);
|
||||
|
||||
auto intersectedEdges = signConfigToIntersectedEdges[intersect.signConfig];
|
||||
for (auto e = 0; e<12; ++e)
|
||||
{
|
||||
if (signConfigToIntersectedEdges[intersect.signConfig] & edges[e].edgeFlag)
|
||||
if (intersectedEdges & edges[e].edgeFlag)
|
||||
{
|
||||
auto v0 = edges[e].vert0;
|
||||
auto v1 = edges[e].vert1;
|
||||
|
@ -54,4 +54,4 @@ namespace MeshReconstruction
|
||||
|
||||
using Fun3s = std::function<double(Vec3 const&)>;
|
||||
using Fun3v = std::function<Vec3(Vec3 const&)>;
|
||||
}
|
||||
}
|
16
external/MeshReconstruction/lib/IO.cpp
vendored
16
external/MeshReconstruction/lib/IO.cpp
vendored
@ -6,13 +6,7 @@ void MeshReconstruction::WriteObjFile(Mesh const& mesh, string const& fileName)
|
||||
{
|
||||
// FILE faster than streams.
|
||||
|
||||
FILE* file;
|
||||
//auto status = fopen_s(&file, fileName.c_str(), "w");
|
||||
//if (status != 0)
|
||||
//{
|
||||
// throw runtime_error("Could not write obj file.");
|
||||
//}
|
||||
file = fopen(fileName.c_str(), "w");
|
||||
FILE* file = fopen(fileName.c_str(), "w");
|
||||
if (file == NULL)
|
||||
{
|
||||
throw runtime_error("Could not write obj file.");
|
||||
@ -24,7 +18,7 @@ void MeshReconstruction::WriteObjFile(Mesh const& mesh, string const& fileName)
|
||||
static_cast<int>(mesh.triangles.size()));
|
||||
|
||||
// vertices
|
||||
for (auto vi = 0; vi < mesh.vertices.size(); ++vi)
|
||||
for (size_t vi = 0; vi < mesh.vertices.size(); ++vi)
|
||||
{
|
||||
auto const& v = mesh.vertices.at(vi);
|
||||
fprintf(file, "v %f %f %f\n", v.x, v.y, v.z);
|
||||
@ -32,7 +26,7 @@ void MeshReconstruction::WriteObjFile(Mesh const& mesh, string const& fileName)
|
||||
|
||||
// vertex normals
|
||||
fprintf(file, "\n");
|
||||
for (auto ni = 0; ni < mesh.vertices.size(); ++ni)
|
||||
for (size_t ni = 0; ni < mesh.vertices.size(); ++ni)
|
||||
{
|
||||
auto const& vn = mesh.vertexNormals.at(ni);
|
||||
fprintf(file, "vn %f %f %f\n", vn.x, vn.y, vn.z);
|
||||
@ -40,7 +34,7 @@ void MeshReconstruction::WriteObjFile(Mesh const& mesh, string const& fileName)
|
||||
|
||||
// triangles (1-based)
|
||||
fprintf(file, "\n");
|
||||
for (auto ti = 0; ti < mesh.triangles.size(); ++ti)
|
||||
for (size_t ti = 0; ti < mesh.triangles.size(); ++ti)
|
||||
{
|
||||
auto const& t = mesh.triangles.at(ti);
|
||||
fprintf(file, "f %d//%d %d//%d %d//%d\n",
|
||||
@ -50,4 +44,4 @@ void MeshReconstruction::WriteObjFile(Mesh const& mesh, string const& fileName)
|
||||
}
|
||||
|
||||
fclose(file);
|
||||
}
|
||||
}
|
@ -52,11 +52,9 @@ Mesh MeshReconstruction::MarchCube(
|
||||
for (auto ix = 0; ix < NumX; ++ix)
|
||||
{
|
||||
auto x = domain.min.x + ix * cubeSize.x;
|
||||
|
||||
for (auto iy = 0; iy < NumY; ++iy)
|
||||
{
|
||||
auto y = domain.min.y + iy * cubeSize.y;
|
||||
|
||||
for (auto iz = 0; iz < NumZ; ++iz)
|
||||
{
|
||||
auto z = domain.min.z + iz * cubeSize.z;
|
||||
@ -64,7 +62,7 @@ Mesh MeshReconstruction::MarchCube(
|
||||
|
||||
// Process only if cube lies within narrow band around surface.
|
||||
auto cubeCenter = min + HalfCubeSize;
|
||||
auto dist = abs(sdf(cubeCenter) - isoLevel);
|
||||
double dist = std::fabs(sdf(cubeCenter) - isoLevel);
|
||||
if (dist > HalfCubeDiag) continue;
|
||||
|
||||
Cube cube({ min, cubeSize }, sdf);
|
||||
|
Loading…
Reference in New Issue
Block a user