我需要一點幫助,我有這個 Perlin 噪聲函式,但我不知道如何正確創建偏移。
我使用它來創建無限地形生成,當我使用這個腳本時,單個塊的噪聲值不能正確組合在一起。他們會制造漏洞。
有沒有辦法解決這個問題?
public float[,] GenerateNoise(int chunkSize, int octaves, string seed, float noiseScale, float persistence, float lacunarity, Vector2 offset)
{
if (noiseScale <= 0)
{
noiseScale = 0.0001f;
}
float halfWidth = chunkSize / 2f;
float halfHeight = chunkSize / 2f;
float[,] noiseMap = new float[chunkSize, chunkSize];
System.Random rand = new System.Random(seed.GetHashCode());
//Octaves offset
Vector2[] octavesOffset = new Vector2[octaves];
for (int i = 0; i < octaves; i )
{
float offset_X = rand.Next(-100000, 100000) offset.x;
float offset_Y = rand.Next(-100000, 100000) offset.y;
octavesOffset[i] = new Vector2(offset_X / chunkSize , offset_Y / chunkSize);
}
for (int x = 0; x < chunkSize; x )
{
for (int y = 0; y < chunkSize; y )
{
float amplitude = 1;
float frequency = 1;
float noiseHeight = 0;
float superpositionCompensation = 0;
for (int i = 0; i < octaves; i )
{
float sampleX = (x - halfWidth) / noiseScale * frequency octavesOffset[i].x * frequency;
float sampleY = (y - halfHeight) / noiseScale * frequency octavesOffset[i].y * frequency;
float noiseValue = Mathf.PerlinNoise(sampleX, sampleY);
noiseHeight = noiseValue * amplitude;
noiseHeight -= superpositionCompensation;
amplitude *= persistence;
frequency *= lacunarity;
superpositionCompensation = amplitude / 2;
}
noiseMap[x, y] = Mathf.Clamp01(noiseHeight);
}
}
return noiseMap;
}
uj5u.com熱心網友回復:
實際上很簡單,只需將塊 x,y 坐標添加到 Mathf.PerlinNoise 中即可。以您的代碼為例,您可以:
將 chunkPosition 作為引數傳遞給它:
public float[,] GenerateNoise(Vector2 chunkPos, int chunkSize, int octaves, string seed, float noiseScale, float persistence, float lacunarity, Vector2 offset)將其添加到 Mathf.PerlinNoise 呼叫中:
float noiseValue = Mathf.PerlinNoise(sampleX chunkPos.x, sampleY chunkPos.y);
然后確保使用適當的 chunkPos 生成每個塊,其中 chunkPos 可以是它的 transform.position 或您擁有的任何坐標。而已。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/392538.html
上一篇:我怎樣才能讓一個ui元素指向一個統一的世界坐標中的位置?
下一篇:Unity3D第一人稱運動
