C++行进立方体算法解释
C++ Marching Cubes Algorithm Explanation
我正在尝试了解行进立方体算法的工作原理。
来源:
http://paulbourke.net/geometry/polygonise/
我不明白你是如何计算“GRIDCELL”值的。确切地说
double val[8];
部分我不清楚它实际应该包含什么。
typedef struct {
XYZ p[8];
double val[8];
} GRIDCELL;
据我了解 XYZ p[8];是输出立方体的顶点坐标。但是什么 val[8];是吗?
移动立方体算法——如链接描述中所述——是一种从采样数据构建多边形表示的算法。
double val[8];
是立方体8个顶点的样本。所以它们不是计算出来的,它们是来自例如的测量值。核磁共振扫描。所以该算法是相反的:获取一组测量数字并从中构建用于可视化的表面表示。
进一步阅读和研究后,解释非常简单。
首先:
- 体素表示三维空间中规则网格上的一个值space。
这个值只是代表所谓的“等值面”。或者换句话说 space.
的密度
double val[8];
简化:
基本上这应该是 -1.0f
到 0.0f
之间的值。
其中 -1.0f 表示实心,0.0f 表示空心 space.
例如,对于 ISO 值,可以使用 perlin/simplex 噪声。
Te val 是单元格每个顶点的 "charge" 级别,它取决于您要创建的形状的尖端。
f.e.: 如果你想制作一个球,你可以使用公式对值进行采样:
for (int l = 0; l < 8; ++l){
float distance = sqrtf(pow(cell.p[l].x - chargepos.x, 2.0) + pow(cell.p[l].y - chargepos.y, 2.0) + pow(cell.p[l].z - chargepos.z, 2.0));
cell.val[l] = chargevalue /pow(distance, 2.0);}
我正在尝试了解行进立方体算法的工作原理。
来源: http://paulbourke.net/geometry/polygonise/
我不明白你是如何计算“GRIDCELL”值的。确切地说
double val[8];
部分我不清楚它实际应该包含什么。
typedef struct {
XYZ p[8];
double val[8];
} GRIDCELL;
据我了解 XYZ p[8];是输出立方体的顶点坐标。但是什么 val[8];是吗?
移动立方体算法——如链接描述中所述——是一种从采样数据构建多边形表示的算法。
double val[8];
是立方体8个顶点的样本。所以它们不是计算出来的,它们是来自例如的测量值。核磁共振扫描。所以该算法是相反的:获取一组测量数字并从中构建用于可视化的表面表示。
进一步阅读和研究后,解释非常简单。
首先:
- 体素表示三维空间中规则网格上的一个值space。
这个值只是代表所谓的“等值面”。或者换句话说 space.
的密度double val[8];
简化:
基本上这应该是 -1.0f
到 0.0f
之间的值。
其中 -1.0f 表示实心,0.0f 表示空心 space.
例如,对于 ISO 值,可以使用 perlin/simplex 噪声。
Te val 是单元格每个顶点的 "charge" 级别,它取决于您要创建的形状的尖端。 f.e.: 如果你想制作一个球,你可以使用公式对值进行采样:
for (int l = 0; l < 8; ++l){
float distance = sqrtf(pow(cell.p[l].x - chargepos.x, 2.0) + pow(cell.p[l].y - chargepos.y, 2.0) + pow(cell.p[l].z - chargepos.z, 2.0));
cell.val[l] = chargevalue /pow(distance, 2.0);}