如何解决地形生成算法的错误
长话短说,以下内容基于mesh generation和terrain heights
在我的代码中,一切似乎都很好。我都重做了,还是出现同样的问题,不知道为什么。
我只知道 Z for
循环的最后一次迭代没有给出正确的高度。
我可以只设置 z-1
并让游戏在地图的其余部分运行
但我觉得这会毁了我下一阶段的开发,所以我请求提示问题可能出在哪里。
perlin 噪声的代码如下
public static class PerlinFilter
{
public static float[] Filter(List<int> keyX,List<int> keyZ,int indexX = 0,int indexZ = 0,int sizeX = 100,int sizeZ = 100,int nOctaves = 3,float fBias = .6f)
{
float[] filtered = new float[(sizeX + 1) * (sizeZ + 1)];
for (int z = indexZ; z < sizeZ; z++)
{
for (int x = indexX; x < sizeX; x++)
{
float fNoise = 0.0f;
float fScale = 1.0f;
float fScaleAcc = 0.0f;
for (int o = 0; o < nOctaves; o++)
{
int nPitch = sizeZ >> o;
int nSampleX1 = x / nPitch * nPitch;
int nSampleZ1 = z / nPitch * nPitch;
int nSampleX2 = (nSampleX1 + nPitch) % sizeX;
int nSampleZ2 = (nSampleZ1 + nPitch) % sizeX;
float fBlendX = (float)(x - nSampleX1) / nPitch;
float fBlendZ = (float)(z - nSampleZ1) / nPitch;
float fSampleT = (1.0f - fBlendX) * keyX[nSampleZ1 * sizeX + nSampleX1] + fBlendX * keyZ[nSampleZ1 * sizeZ + nSampleX2];
float fSampleB = (1.0f - fBlendX) * keyX[nSampleZ2 * sizeX + nSampleX1] + fBlendX * keyZ[nSampleZ2 * sizeZ + nSampleX2];
fNoise += (fBlendZ * (fSampleB - fSampleT) + fSampleT) * fScale;
fScaleAcc += fScale;
fScale /= fBias;
}
filtered[z * sizeX + x] = fNoise / fScaleAcc;
}
}
return filtered;
}
}
网格代码如下:
void Generate(bool flat)
{
vertices = new Vector3[(x + 1) * (z + 1)];
for (int i = 0,iz = 0; iz <= z; iz++)
{
for (int ix = 0; ix <= x; ix++,i++)
{
if (flat)
vertices[i] = new Vector3(ix,iz);
else
vertices[i] = new Vector3(ix,PerlinHeight(ix,iz),iz);
}
}
triangles = new int[x * z * 6];
for (int tris = 0,vert = 0,iz = 0; iz < z; iz++,vert++)
{
for (int ix = 0; ix < x; ix++,vert++,tris += 6)
{
triangles[tris + 0] = vert + 0;
triangles[tris + 1] = vert + x + 1;
triangles[tris + 2] = vert + 1;
triangles[tris + 3] = vert + 1;
triangles[tris + 4] = vert + x + 1;
triangles[tris + 5] = vert + x + 2;
}
}
}
public int PerlinHeight(int _x,int _z) => (int)(keyPerlin[_z * x + _x] * 1f);
keyPerlin
是 PerlinFilter.Filter 的结果。
如果很明显我需要在此处添加更多代码,请告诉我,这是在几个月前完成的,我一直在研究游戏的其他部分,同时接受 z-1
解决方法,但在这一点我真的需要解决这个问题。
解决方法
在您的噪声过滤器生成过程中
float[] filtered = new float[(sizeX + 1) * (sizeZ + 1)];
for (int z = indexZ; z < sizeZ; z++)
{
for (int x = indexX; x < sizeX; x++)
{
...
=> 你没有用有效值填充完整的数组! z== SizeZ
和 x==SizeX
的最后一行保持默认值 0
。
在网格中时
vertices = new Vector3[(x + 1) * (z + 1)];
for (int i = 0,iz = 0; iz <= z; iz++)
{
for (int ix = 0; ix <= x; ix++,i++)
{
...
=> 您将最后一行顶点全部设置为 0
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。