as you ca see it’s pretty obvious that it uses noise, but how can I make the mountain look more natural, here’s my code
local Seed = 0
local WorldSize = 100
local Scale = 250
local Frequency = 10
local Amplitude = 50
local TerrainYLength = 100
local CurrentX = 0
local CurrentZ = 0
local CurrentXOffset = 0
local CurrentZOffset = 0
local function ReturnTerrain()
return game.ReplicatedStorage.TerrainBlock:Clone()
end
function color3torgb(color3)
return color3.R*255,color3.G*255,color3.B*255
end
local random = Random.new(Seed)
local xOffset = random:NextNumber(-100000, 100000)
local zOffset = random:NextNumber(-100000, 100000)
local MidPoint = WorldSize/2
local BaseModel = Instance.new("Model")
repeat
CurrentX = 0
CurrentXOffset = 0
repeat
local sampleX = CurrentX / Scale * Frequency + xOffset
local sampleZ = CurrentZ / Scale * Frequency + zOffset
local baseY = math.clamp((math.noise(sampleX, sampleZ) + 0.5), 0, 1)
local baseAmp = Amplitude
baseAmp-=(CurrentX - WorldSize/2)
baseAmp*=5
local y = baseY * ( baseAmp )
local defaultColor = Color3.fromRGB(85, 0, 127)
for _,v in game:GetService('ReplicatedStorage'):FindFirstChild("TerrainLevelConfigurations"):GetChildren() do
local min = v:FindFirstChild("MinHeight").Value
local max = v:FindFirstChild("MaxHeight").Value
if y>min and y<max then
local c:Color3 = Color3.new(color3torgb(v.Color.Value))
local var = v.Variety.Value
local function get(x)
x = math.clamp(x-Random.new():NextNumber(-var, var), 0, 255)
return x
end
defaultColor = Color3.fromRGB( get(c.R), get(c.G), get(c.B) )
end
end
local c = ReturnTerrain()
c.Position = Vector3.new(CurrentXOffset, y, CurrentZOffset)
c.Color = defaultColor
c.Size = c.Size+Vector3.new(0, TerrainYLength, 0)
c.Position -= Vector3.new(0, TerrainYLength/2, 0)
c.Parent = BaseModel
CurrentXOffset+=c.Size.X
CurrentX+=1
until CurrentX>=WorldSize
CurrentZ+=1
CurrentZOffset+=4
until CurrentZ>=WorldSize
BaseModel:PivotTo(CFrame.new(0, BaseModel:GetExtentsSize().Y/2, 0))
BaseModel.Parent = workspace
local Seed = 0
local WorldSize = 100
local Scale = 250
local Frequency = 10
local Amplitude = 50
local TerrainYLength = 100
local CurrentX = 0
local CurrentZ = 0
local CurrentXOffset = 0
local CurrentZOffset = 0
local function ReturnTerrain()
return game.ReplicatedStorage.TerrainBlock:Clone()
end
function color3torgb(color3)
return color3.R * 255, color3.G * 255, color3.B * 255
end
local random = Random.new(Seed)
local xOffset = random:NextNumber(-100000, 100000)
local zOffset = random:NextNumber(-100000, 100000)
local MidPoint = WorldSize / 2
local BaseModel = Instance.new("Model")
repeat
CurrentX = 0
CurrentXOffset = 0
repeat
local sampleX = CurrentX / Scale * Frequency + xOffset
local sampleZ = CurrentZ / Scale * Frequency + zOffset
local baseY = math.clamp((math.noise(sampleX, sampleZ) + 0.5), 0, 1)
local additionalNoise = math.clamp((math.noise(sampleX * 2, sampleZ * 2) + 0.5), 0, 1) * 0.2
local y = (baseY + additionalNoise) * Amplitude
local baseAmp = Amplitude
baseAmp -= (CurrentX - WorldSize / 2)
baseAmp *= 5
y *= baseAmp
local defaultColor = Color3.fromRGB(85, 0, 127)
for _, v in game:GetService('ReplicatedStorage'):FindFirstChild("TerrainLevelConfigurations"):GetChildren() do
local min = v:FindFirstChild("MinHeight").Value
local max = v:FindFirstChild("MaxHeight").Value
if y > min and y < max then
local c:Color3 = Color3.new(color3torgb(v.Color.Value))
local var = v.Variety.Value
local function get(x)
x = math.clamp(x - Random.new():NextNumber(-var, var), 0, 255)
return x
end
defaultColor = Color3.fromRGB(get(c.R), get(c.G), get(c.B))
end
end
local c = ReturnTerrain()
c.Position = Vector3.new(CurrentXOffset, y, CurrentZOffset)
c.Color = defaultColor
c.Size = c.Size + Vector3.new(0, TerrainYLength, 0)
c.Position -= Vector3.new(0, TerrainYLength / 2, 0)
c.Parent = BaseModel
CurrentXOffset += c.Size.X
CurrentX += 1
until CurrentX >= WorldSize
CurrentZ += 1
CurrentZOffset += 4
until CurrentZ >= WorldSize
BaseModel:PivotTo(CFrame.new(0, BaseModel:GetExtentsSize().Y / 2, 0))
BaseModel.Parent = workspace
Try this, as you can see it adds an additional noise layer for different variation within the script, as seen here