我正在嘗試在我的地圖上生成一個網格并根據柏林噪聲值添加節點。根據從某個位置的 perlin 噪聲獲得的值,我將添加一個新節點,該節點將具有某種型別,例如 Mountain、Water 等來表示 terrian。在這里,我試圖使其值大于 0.5,這意味著它只有山脈,因此黑色立方體應該圍繞山區,但是,我的黑色立方體與柏林噪聲中的山區不匹配,我似乎無法弄清楚我為什么會出錯。希望能深入了解我如何實作這一目標。
private void LocateWalkableCells()
{
for(int z = 0; z < Height; z )
{
for(int x = 0; x < Width; x )
{
noise = GetNoiseValue(x, z);
if(noise > 0.5) {
grid[x,z] = new Node(new Vector3(x, 0, z), TerrainType.Mountain, 1);
}
else {
grid[x,z] = new Node(new Vector3(x, 0, z), TerrainType.Grass, 1);
}
}
}
}
private float GetNoiseValue(int x, int z)
{
int pos = (x * Width) z;
return Mathf.Round(terrainGenerator.noiseArray[pos] * 10) / 10;
}
// Draw gizmos to visualize colour
void OnDrawGizmos()
{
Gizmos.DrawWireCube(transform.position, new Vector3(Width, 1, Height));
if(grid != null)
{
foreach(Node n in grid)
{
if(n.TerrainType == TerrainType.Grass)
{
Gizmos.color = Color.green;
}
else if(n.TerrainType == TerrainType.Mountain)
{
Gizmos.color = Color.black;
}
Gizmos.DrawCube(n.Position, Vector3.one * (nodeDiameter - .1f));
}
}
}
noiseArray在以下代碼中用于地形的頂點:
vertices = new Vector3[(Width 1) * (Depth 1)];
noiseArray = PerlinNoise();
int i = 0;
for(int z = 0; z <= Depth; z )
{
for(int x = 0; x <= Width; x )
{
var currentHeight = noiseArray[i];
if(currentHeight > HeightThreshold)
{
currentHeight *= HeightMultiplier;
}
vertices[i] = new Vector3(x, currentHeight, z);
i ;
}
}
輸出

建議答案的結果
似乎仍然錯過了一些山區,用綠色而不是黑色著色。

uj5u.com熱心網友回復:
它認為問題出在
var pos = (x * Width) z;
因為x您是否在網格寬度上編制索引,您可能更愿意
var pos = z * Width x;
換句話說,你想要
- 跳過
z行 - 每行都有
Width元素 - 然后從那里取第
xth 個元素
假設您的地形是按行排列的。
或者如果它是按列排列的(這很不尋常但可能)
var pos = x * Height z;
或者換句話說
- 跳過
x列 - 每列都有
Height元素 - 然后從那里取第
zth 個元素
另見將一維陣列的索引轉換為二維陣列,即行和列
更新
現在您已經展示了它需要的地形生成代碼
var pos = z * (Width 1) x;
因為地形陣列實際上Width 1每行都有元素。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/432329.html
標籤:C# unity3d 柏林噪声 unity3d-地形
上一篇:沒有Riggibody的運動
