# Terrain generator using 2D noise and 3D noise

Hello, I trying to implement 3D noise for hills and cliffs and other stuff like that. I generate a 2D noise for a base map but when I’m generating 3D noise I’m getting a result like that. If you can help me then write thanks for fast help and here is a photo of my work and what im want.

PS. I’m not using chunks in this because I need all-terrain rendered and I’m adding to this falloff map.

------------------------------------------------------------ Photos ------------------------------------------------------------

What I want

This photo is form this video: https://www.youtube.com/watch?v=ehhI29laMFE

What I have (This white cubes is 3D noise)

This is how i generate 3D noise

``````function Terrian.Generate3DNoise()

local Offset = Vector3.new(0, 0, 0)

local OctavesOffsets = {}

for i = 1, Info.Octaves do

local OffsetX = Info.Seed + Offset.X
local OffsetY = Info.Seed + Offset.Y
local OffsetZ = Info.Seed + Offset.Z

OctavesOffsets[i] = Vector3.new(OffsetX, OffsetY, OffsetZ)

end

for X = 1, Info.Size do

Noise3D[X] = {}

for Y = 1, Info.Size do

Noise3D[X][Y] = {}

for Z = 1, Info.Size do

local Amplitude = 4
local Frequency = 1
local NoiseHeight = 0

for i = 1, Info.Octaves do

local SampleX = (X - HalfSize) / Info.Resolution * Frequency + OctavesOffsets[i].X
local SampleY = (Y - HalfSize) / Info.Resolution * Frequency + OctavesOffsets[i].Y
local SampleZ = (Z - HalfSize) / Info.Resolution * Frequency + OctavesOffsets[i].Z

local PerlinValue = math.noise(SampleX, SampleY, SampleZ)

NoiseHeight = NoiseHeight + PerlinValue * Amplitude

Amplitude = Amplitude * Info.Persistance
Frequency = Frequency * Info.Lacunarity

end

Noise3D[X][Y][Z] = NoiseHeight

end

RunService.Heartbeat:Wait()

end

end

print("Rendered!")

end
``````

This is for add noise life

``````Terrian.GenerateFallOfMap()
Terrian.GenerateNoise()
Terrian.Generate3DNoise()

Terrian.GenerateMaterial()

for X = 1, Info.Size do

for Z = 1, Info.Size do

Noise[X][Z] = math.clamp(Noise[X][Z] - FallOfMap[X][Z], 0, 1)
local Height = Noise[X][Z]

Terrian.GenerateTerrain(Height * Info.Height, X, Z, MaterialMap[X][Z])

--local Part = Instance.new("Part", workspace)
--Part.Size = Vector3.new(1, 1, 1)
--Part.Anchored = true

--local Color = ColorMap[X][Z]

--Part.Position = Vector3.new(X, Height, Z)
--Part.Color = Color3.new(Color.R, Color.G, Color.B)

for Y = 1, Info.Size do

local Density = Noise3D[X][Y][Z] - FallOfMap[X][Z]
local Density_Modifier = (Height - Y) / 30

Density = Density + Density_Modifier

if Density >= 0 then

local Part = Instance.new("Part", workspace)
Part.Anchored = true
Part.Size = Vector3.new(1, 1, 1)

Part.Position = Vector3.new(X, Y + Info.Min_Height, Z)

end

end

end

RunService.Heartbeat:Wait()

end
``````