首先,让我明确一点,我不想将图像堆转换为3D模型。
我有一个*.stl文件(一个三角形表面网格),我想将其切片成一个图像堆。我看了一下Slic3r和Meshmixer,但它们都只提供Gcode。
因此,考虑到我拥有表面上所有点的顶点(这是非凸的),以及它们之间的连接。那么,有哪些库可以帮助我完成这项任务呢?
我的感觉是,我需要在没有通过已知顶点的切片上插值边界。
我熟悉Python,并能够使用C++,但愿意拓宽自己的视野。
首先,让我明确一点,我不想将图像堆转换为3D模型。
我有一个*.stl文件(一个三角形表面网格),我想将其切片成一个图像堆。我看了一下Slic3r和Meshmixer,但它们都只提供Gcode。
因此,考虑到我拥有表面上所有点的顶点(这是非凸的),以及它们之间的连接。那么,有哪些库可以帮助我完成这项任务呢?
我的感觉是,我需要在没有通过已知顶点的切片上插值边界。
我熟悉Python,并能够使用C++,但愿意拓宽自己的视野。
glClearColor
将屏幕缓冲区像往常一样清除为背景颜色glClearDepth
将深度缓冲区清除为相机空间中切片的Z坐标glDepthFunc(GL_EQUAL)
类似于:
// here set view
glClearColor( 0.0,0.0,0.0,0.0 ); // <0.0,1.0> r,g,b,a
glClearDepth( 0.5 ); // <0.0,1.0> ... 0.0 = z_near, 1.0 = z_far
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDepthFunc(GL_EQUAL);
// here render mesh
Z==Slice coordinate
片段的切片。这也可以通过 GLSL 实现,即丢弃所有具有不同 Z
的片段。 DirectX 应该有类似的功能(我不使用它,所以不能确定)。auto loadRes = MeshLoad::fromAnySupportedFormat( "C:/Meshes/spartan.stl" );
if ( !loadRes.has_value() )
return false; // loadRes.error() for more info, mesh load failed
const float voxelSize = 0.1f;
const auto grid = meshToLevelSet( loadRes.value(), AffineXf3f{}, Vector3f::diagonal( voxelSize ) );
const auto bbox = loadRes->getBoundingBox();
const auto vdbDims = grid->evalActiveVoxelDim();
const Vector3i dims = { vdbDims.x(),vdbDims.y(),vdbDims.z() };
//The less the difference between min and max is the more contrast the images are.
const float min = 0.0f;
const float max = 0.0f;
const auto axis = SlicePlain::XY;
VdbVolume vdb{ .data = grid, .dims = dims, .voxelSize = Vector3f::diagonal( voxelSize ), .min = min, .max = max };
auto saveRes = VoxelsSave::saveAllSlicesToImage( "C:/Meshes/slices/", vdb, axis );
return saveRes.has_value();