行进立方体,体素,需要一些建议

我正在试图构建一个适当的可破坏地形,仅用于研究目的。 那么,一切都很顺利,但决议并不足够让我满意。 我已经看到很多例子,人们如何实现MC算法,但据我了解,其中大部分都使用函数来对最终网格进行三角剖分,这对我来说并不合适。

我会尽量简单地解释我如何构建我的地形,也许你们中的某个人会给我建议如何改进,或者增加最终地形的分辨率。

1)预先计算MC三角形。

我正在通过MC查找表针对每种情况(0-255)运行简单循环,并在愤怒中计算三角形:[0,0,0] - [1,1,1]。 这里没有问题。

2)地形

我有地形类,它存储我的体素。 一般来说,它看起来像这样:

int size = 32;//Size of each axis.
unsigned char *voxels = new unsigned char[(size * size * size)/8];

所以,每个轴的长度是32个单位,但是,我存储每个位的体素信息。 意思是如果打开位(1),就有东西,并且应该绘制一些东西。

我有几个功能:

TurnOn(x,y,z);
TurnOff(x,y,z);

打开或关闭体素的位置。 (帮助使用位)。

一旦分配地形,我正在运行珀林噪声,并打开或关闭位。

我的地形类有一个更多的功能,从x,y,z位置提取Marching Cubes案例编号(0-255):

unsigned char GetCaseNumber(x,y,z);

通过确定该体素的邻居是打开还是关闭。 这里没有问题。

3)渲染部分

我为每个轴循环,提取案例编号,然后通过大小写获得预先计算的三角形,转换为x,y,z坐标并绘制这些三角形。 这里没有问题。

所以结果如下所示:

地形

但是,正如你所看到的,在任何一个地方,分辨率都不具有可比性,例如:MC http://www.angelfire.com/linux/myp/MCAdvanced/mcnormal.gif

我在MC例子中看到,人们正在使用一种叫做“iso值”的东西,我不明白这一点。 任何关于如何改进我的工作的建议,或什么是iso值,以及如何在统一网格中实现它,都是非常可爱的。


问题是你的体素是一个二进制掩码(只是打开或关闭)。

这对于“默认”行军立方体算法来说非常棒,但它的确意味着你在网格中获得了锐利的边缘。

这个平滑的例子可能是由平滑的标量数据产生的。

想象一下,如果您的数据在0到1.0之间平稳变化,并且您将阈值设置为0.5。 现在,在检测出给定立方体的配置后,您可以查看所有生成的顶点。

假设你在两个体素之间的边上有一个顶点,一个值为0.4,另一个为0.7。 然后将顶点移动到在0.4和0.7之间进行插值时恰好达到0.5(阈值)的位置。 所以它会更接近0.4顶点。

这样,每个顶点恰好位于内插的 iso表面上,您将生成更平滑的三角形。

但它确实需要你的输入体素是标量(并且顺利变化)。 如果你的体素是双水平的(全都是0或1),这将产生与你之前相同的三角形。

另一个想法(不是你的问题的答案,但可能有用):

为了得到更平滑的渲染,没有数学上的正确性,可以为每个顶点计算一个平均法向量,并使用该法线连接到每个三角形。 这将隐藏锋利的边缘。

链接地址: http://www.djcxy.com/p/6341.html

上一篇: Marching Cubes, voxels, need a bit of suggestions

下一篇: Marching cubes?