我已经成功地在 C# XNA 中制作了一个行进立方体类,并且正在使用 Lib 噪声来生成 3d perlin 噪声,但是当我尝试使用 perlin 噪声的值作为我的行进立方体的密度来生成地形时,它会生成一大块行进的立方体,里面有看似随机的三角形。我分离了行进立方体,并给它任意的 3d 密度数组来运行,这样我就可以确保一切正常并且看起来很好,我让地形生成代码生成了正常的立方体,我得到了一个正常的地形,但是问题是每个立方体的角落从噪声中获取值总是从负数转换为正数如此之快,以至于行进的立方体看起来就像一团乱七八糟的东西。
这是我用来生成地形的代码:
public MarchingCube[, ,] getTerrainChunk(int size, int stepsize)
{
MarchingCube[, ,] temp = new MarchingCube[size / stepsize, size / stepsize, size / stepsize];
for (int x = 0; x < size; x += stepsize)
{
for (int y = 0; y <size; y += stepsize)
{
for (int z = 0; z < size; z += stepsize)
{
Vector3[] corners = { new Vector3(x,y,z), new Vector3(x,y+stepsize,z),new Vector3(x+stepsize,y+stepsize,z),new Vector3(x+stepsize,y,z), new Vector3(x,y,z+stepsize), new Vector3(x,y+stepsize,z+stepsize),
new Vector3(x+stepsize,y+stepsize,z+stepsize), new Vector3(x+stepsize,y,z+stepsize)};
float[] densities = { GetDensity(corners[0]),GetDensity(corners[1]),GetDensity(corners[2]),GetDensity(corners[3]),GetDensity(corners[4]),
GetDensity(corners[5]),GetDensity(corners[6]),GetDensity(corners[7])};
if (x == 0 && y == 0 && z == 0)
{
temp[x / stepsize, y / stepsize, z / stepsize] = new MarchingCube(densities, corners, device);
}
else
temp[x / stepsize, y / stepsize, z / stepsize] = new MarchingCube(densities, corners);
}
}
}
return temp;
}
GetDensity 方法如下:
private float GetDensity(Vector3 point)
{
return (float)terrain.GetValue(point));
}
我认为问题在于我没有正确使用噪音来获得行进立方体角的密度,但到目前为止,我的谷歌搜索结果根本没有太大帮助。那么有谁知道如何正确使用噪声来生成平滑的地形?或者还有什么可能导致这个问题?
我在http://imgur.com/a/D1uMC发布了屏幕截图 ,前两个使用行进立方体显示,最后一个是普通立方体。
编辑:所以从图片中我发现行进的立方体实际上是按照它们所赋予的值来工作的,问题在于我的噪音以及我如何使用它。有谁知道任何好的资源用于基于噪声的 3d 地形生成?