我已成功在C#XNA中制作行进立方体类并使用Lib噪声生成3d perlin噪声,但当我尝试使用perlin噪声的值生成地形作为行进立方体的密度时,它会生成大块的行进立方体,里面看似随机的三角形。我将行进立方体分开并给它任意三维的密度数组来运行,所以我可以确保一切正常,它看起来很好,我有地形生成代码生成正常的立方体,我得到了一个正常的地形,但问题是每个立方体的角落从噪声中得到的值总是从负到正切换到如此快,以至于行进的立方体看起来像混乱的混乱。
这是我用来生成地形的代码:
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资源基于噪声的地形生成?
答案 0 :(得分:0)
问题在于我是如何读取噪音的,默认情况下我非常“缩小”,因此通过将步长更改为浮点数然后使用较小的增量我能够获得所需的结果。基本上“放大”了噪音区域。