我在这里读这篇文章:http://paulbourke.net/geometry/polygonise/
目前,我有一个类似雷射艇的地形生成使用单纯形噪声,我把它分成16x16块,其中有32x32x128块现在,我想用我在行进立方体中生成的多元论函数的噪声。但我的问题是如何计算等值线?我不明白。
这里的任何人都知道一篇更多的关于勺子的文章。大声笑
编辑:
嘿,我在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;
}

最佳答案

好吧,保罗的消息来源真的是“一匙羹”。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].

效果很简单——当你远离每三个点时,等值线几乎为零。离这一点越近,f[i]越小,等值线就越大。
距离是通常的平方欧氏距离
dist(p1, p2) = sqrt( (p1.x - p2.x)^2 + (p1.y - p2.y)^2 + (p1.z - p2.z)^2)

要实现“类似于Minecraft”的等值面,需要使用其他度量看出租汽车(又名曼哈顿)度量:
dist1(p1, p2) = abs(p1.x - p2.x) + abs(p1.y - p2.y) + abs(p1.z - p2.z)

或最大度量
distMax(p1, p2) = max( abs(p1.x - p2.x), abs(p1.y - p2.y), abs(p1.z - p2.z) )

这些度量中的“球体”(即满足球体方程“dist=R”的集合)是立方体。
反转它们,计算和(在fsample1函数中全部完成),通过实验选择一些典型的等值线并查看结果。

关于algorithm - Marching Cubes算法中的等值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11177604/

10-11 21:01