Marching Cubes算法中的等值
我正在阅读这篇文章:http://paulbourke.net/geometry/polygonise/。
目前,我有一个像使用单工噪声生成的地形一样的Minecraft,我分成16x16块,有32x32x128块。 现在,我想将我生成的噪音用于行进立方体中的Polygonise函数。 但我的问题是如何计算isovalue? 我不明白。
这里的任何人都知道更多的勺子饲料文章。 大声笑
编辑:
嘿,我在http://paulbourke.net/geometry/polygonise/marchingsource.cpp上找到了这个。
sSourcePoint []的值为0.5,所以它只是居中对象,但是fResult + = 0.5 /(fDx * fDx + fDy * fDy + fDz * fDz)会做什么? Omg,我被代码吓倒了。
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函数中完成所有操作),通过实验选择一些典型的iso值并查看结果。
链接地址: http://www.djcxy.com/p/37237.html