【问题标题】:C++ Marching Cubes Algorithm Explanation [closed]C ++行进立方体算法解释[关闭]
【发布时间】:2015-01-11 01:45:23
【问题描述】:

我正在尝试了解行进立方体算法的工作原理。

来源: http://paulbourke.net/geometry/polygonise/

我不明白的是您如何计算“GRIDCELL”值。准确的说

 double val[8];

部分对我来说并不清楚它实际上应该包含什么。

typedef struct {
   XYZ p[8];
   double val[8];
} GRIDCELL;

据我了解 XYZ p[8];是输出立方体的顶点坐标。但是什么 val[8];是吗?

【问题讨论】:

    标签: c++ algorithm graphics 3d marching-cubes


    【解决方案1】:

    如链接描述中所述,行进立方体算法是一种从采样数据构建多边形表示的算法。

    double val[8];
    

    是立方体 8 个顶点的样本。所以它们不是计算出来的,它们是来自例如的测量值。核磁共振扫描。所以算法是相反的:获取一组测量的数字并从中构造一个表面表示以进行可视化。

    【讨论】:

    • 对不起,我还是不明白。如果我有一个立方体,你能给我一个例子吗?样品是什么?
    • 您很可能会从文件中读取它们或从网络连接或其他来源接收它们。
    【解决方案2】:

    Te val 是单元格每个顶点的“电荷”水平,它取决于您想要创建的形状的尖端。 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);}
    

    【讨论】:

    • 有趣的谢谢! :)
    【解决方案3】:

    经过进一步阅读和研究,解释很简单。

    首先:

    • 体素表示三维空间中规则网格上的值。

    此值仅表示所谓的“等值面”。或者换句话说,空间的密度。

    double val[8];
    

    为了简化: 基本上这应该是-1.0f0.0f 之间的值。 其中 -1.0f 表示实心空间,0.0f 表示空白空间。

    例如,对于 ISO 值,可以使用 perlin/simplex 噪声。

    【讨论】:

    • 对于 perlin/simplex 噪声作为源,除了行进立方体算法之外,还有其他算法。例如,如果噪声是 2D 的,您可以使用一些高度场技术,或者使用 perlin 噪声中使用的三次插值来构建曲面并将它们细分为三角形以进行可视化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    相关资源
    最近更新 更多