Marching Cubes算法中的等值

时间:2012-06-24 12:54:23

标签: algorithm opengl cubes

我正在阅读这篇文章:http://paulbourke.net/geometry/polygonise/

目前,我有一个使用单纯噪声生成的类似地形的地形,我将其划分为16x16块,具有32x32x128块。现在,我想在行进立方体中使用我生成的Polygonise函数的噪声。但我的问题是如何计算isovalue?我不明白。

这里的任何人都知道更多的勺子文章。洛尔

编辑:

嘿,我在http://paulbourke.net/geometry/polygonise/marchingsource.cpp找到了这个。

sSourcePoint []的值为0.5,所以它只是居中对象,但fResult + = 0.5 /(fDx * fDx + fDy * fDy + fDz * fDz)是什么?哦,我对代码感到害怕。

GLfloat fSample1(GLfloat fX, GLfloat fY, GLfloat fZ)
{
        GLdouble fResult = 0.0;
        GLdouble fDx, fDy, fDz;
        fDx = fX - sSourcePoint[0].fX;
        fDy = fY - sSourcePoint[0].fY;
        fDz = fZ - sSourcePoint[0].fZ;
        fResult += 0.5/(fDx*fDx + fDy*fDy + fDz*fDz);

        fDx = fX - sSourcePoint[1].fX;
        fDy = fY - sSourcePoint[1].fY;
        fDz = fZ - sSourcePoint[1].fZ;
        fResult += 1.0/(fDx*fDx + fDy*fDy + fDz*fDz);

        fDx = fX - sSourcePoint[2].fX;
        fDy = fY - sSourcePoint[2].fY;
        fDz = fZ - sSourcePoint[2].fZ;
        fResult += 1.5/(fDx*fDx + fDy*fDy + fDz*fDz);

        return fResult;
}

1 个答案:

答案 0 :(得分:2)

好吧,保罗的消息来源真的是“勺子”。 fSample1之前的评论说:

//fSample1 finds the distance of (fX, fY, fZ) from three moving points

基本上,他正在创造一个所谓的“元球”对象,因此他需要将三个距离函数(距离fSourcePoint [i]的距离)“混合”为一个。为此,他采取了

Isovalue = 1/f[0] + 1/f[1] + 1/f[2]

,其中

f[i] = 1/DistFromCenterToSourcePoint[i].

效果很简单 - 当你远离每三个点时,isovalue几乎为零。越接近点 - f [i]越小,等值越大。

距离是通常的欧氏距离

dist(p1, p2) = sqrt( (p1.x - p2.x)^2 + (p1.y - p2.y)^2 + (p1.z - p2.z)^2)

要实现“类似Minecraft”的等值面,您需要使用其他一些指标。看一下taxicab(a.k.a. Manhattan)指标:

dist1(p1, p2) = abs(p1.x - p2.x) + abs(p1.y - p2.y) + abs(p1.z - p2.z)

或max-metric

distMax(p1, p2) = max( abs(p1.x - p2.x), abs(p1.y - p2.y), abs(p1.z - p2.z) )

这些指标中的“球体”(即满足球体方程“dist = R”的集合)是立方体。

反转它们,计算总和(在fSample1函数中完成所有操作),通过实验选择一些典型的isovalue并查看结果。