我试图了解行进立方体算法的工作原理。
资料来源: http: //paulbourke.net/geometry/polygonise/
我不明白的是你如何计算“GRIDCELL”值。确切地说
double val[8];
我不清楚它实际上应该包含什么。
typedef struct {
XYZ p[8];
double val[8];
} GRIDCELL;
据我了解 XYZ p[8]; 是输出立方体的顶点坐标。但是什么 val[8]; 是?
我试图了解行进立方体算法的工作原理。
资料来源: 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 个顶点的样本。所以它们不是计算出来的,它们是来自例如 MRI 扫描的测量值。所以算法是相反的:取一组测量的数字并从中构造一个表面表示以进行可视化。
经过进一步阅读和研究,解释很简单。
首先:
该值仅代表所谓的“等值面”。或者换句话说,空间的密度。
double val[8];
简化:基本上这应该是一个介于-1.0f
to之间的值0.0f
。其中 -1.0f 表示实心空间,0.0f 表示空白空间。
例如,对于 ISO 值,可以使用 perlin/simplex 噪声。
Te val 是单元格每个顶点的“电荷”水平,它取决于您想要创建的形状的尖端。fe:如果您想制作一个球,您可以使用以下公式对值进行采样:
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);}