【问题标题】:Isovalue in Marching Cubes AlgorithmMarching Cubes 算法中的等值
【发布时间】:2012-06-24 12:54:22
【问题描述】:

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

目前,我有一个类似我的世界的地形,使用单纯形噪声生成,我将其划分为 16x16 块,其中包含 32x32x128 块。现在,我想在行进立方体中使用我为 Polygonise 函数生成的噪声。但我的问题是如何计算等值?没看懂。

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

编辑:

嘿,我在 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;
}

【问题讨论】:

  • 你不计算等值;你设置等值。音量由f(x,y,z) = isovalue 隐式定义,其中f 是一个标量3D 场(噪声)。您需要以某种方式在点而不是块上定义值。
  • 谢谢。这有很大帮助。现在,我正在尝试理解paulbourke.net/geometry/polygonise/marchingsource.cpp 中的一些代码。我找到了我认为给出分数的 fSample1。但我并不完全理解。他是如何在只返回一个浮点数的情况下创建 3 个对象的?
  • fSample* 函数定义标量 3D 字段;为什么会有 3 个对象? sSourcePoints 只是使字段动态化(参见vSetTime)。等值被称为fTargetValue(见l. 518)。
  • 我设法通过返回 fResult = (fY + noise); 来渲染地形。噪声 = scaled_octave_noise_3d( 3, 1, 0.5, 0, fTargetValue, fX, fY, fZ ) 来自单纯形柏林噪声;这是屏幕截图。 dropbox.com/s/j3rlltjjo13vo8h/mcubes.png 。老实说,我没有得到标量 3D 字段。是这个en.wikipedia.org/wiki/Vector_field吗?对不起,我对这个话题很陌生。它与向量微积分有什么关系吗?顺便说一句,你真的很有帮助。非常感谢。
  • 一个 field 这里是任何 n-dim 函数,而 scalar 在这里真正意味着 single valued。咳咳,这是一个 QA 网站,没有论坛;那么您的确切问题是什么,还是我在任何地方回答过?

标签: algorithm opengl cubes


【解决方案1】:

好吧,Paul 的消息来源确实是“被灌输的”。 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 函数中完成所有操作),通过实验选择一些典型的等值并查看结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多