首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Marching Cubes算法中的Isovalue

Marching Cubes算法中的Isovalue
EN

Stack Overflow用户
提问于 2012-06-24 20:54:23
回答 1查看 1.9K关注 0票数 2

我在这里读了一篇文章:http://paulbourke.net/geometry/polygonise/

目前,我有一个类似于“我的世界”的地形,它是使用单工噪声生成的,我将其分成16x16个块,每个块有32x32x128个块。现在,我想在行进立方体中使用我为Polygonise函数生成的噪波。但我的问题是如何计算等值线?我还是不明白。

在座的任何人都知道一篇更有说服力的文章。LOL

编辑:

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

sSourcePoint[]的值为0.5,所以它只是将对象居中,但是fResult += 0.5/(fDx*fDx + fDy*fDy + fDz*fDz)做了什么?天哪,我被这些代码吓坏了。

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2012-06-27 18:48:24

嗯,保罗的消息来源真的是“填鸭式”的。fSample1前面的评论是这样说的:

代码语言:javascript
复制
//fSample1 finds the distance of (fX, fY, fZ) from three moving points

基本上,他正在创建一个所谓的“metaball”对象,因此他需要将三个距离函数(到fSourcePointi的距离)“混合”成一个。为此,他使用

代码语言:javascript
复制
Isovalue = 1/f[0] + 1/f[1] + 1/f[2]

哪里

代码语言:javascript
复制
f[i] = 1/DistFromCenterToSourcePoint[i].

效果很简单-当你远离每三个点时,等值线几乎为零。离点越近-- fi越小,等值线越大。

距离是通常的平方欧几里德距离。

代码语言:javascript
复制
dist(p1, p2) = sqrt( (p1.x - p2.x)^2 + (p1.y - p2.y)^2 + (p1.z - p2.z)^2)

要实现“类似于我的世界”的等值面,您需要使用一些其他度量。看看出租车(也就是曼哈顿)指标:

代码语言:javascript
复制
dist1(p1, p2) = abs(p1.x - p2.x) + abs(p1.y - p2.y) + abs(p1.z - p2.z)

或者最大度量

代码语言:javascript
复制
distMax(p1, p2) = max( abs(p1.x - p2.x), abs(p1.y - p2.y), abs(p1.z - p2.z) )

这些度量中的“球体”(即,满足球体方程"dist =R“的集合)是立方体。

将它们倒置,计算和(在fSample1函数中全部计算),选择一些典型的等值并通过实验查看结果。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11177604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档