How Can I add Fractal Noise to my Terrain System?

Hello, there. I need help on how to add fractal noise to my 3d Terrain Perlin noise system, as I want to make more advanced terrain than what I can do with this system I made. I’ve tried and failed, as I do not have enough knowledge to make this work .please help if you can. Thanks!!

local SERVER_STORAGE = game:GetService("ServerStorage")
local DATA_MODULE = require(SERVER_STORAGE.Modules:WaitForChild("DataModule"))
local ERROR_MODULE = require(SERVER_STORAGE.Modules:WaitForChild("ErrorModule"))

local STARTING_POSITION = DATA_MODULE.ChunkSettings.ChunkStartingPos
local DYNAMIC_POSITION = DATA_MODULE.ChunkSettings.ChunkDynamicPos
local RELATIVE_POSITION = DATA_MODULE.ChunkSettings.RelativePosition
local CHUNK_NUMBER = 0
local Z_INCREMENT_AMOUNT  = 0
local BLOCK_VECTOR = 0
local BLOCK_NUMBER = 0
local INVERSE_X = 0
local INVERSE_Z = 0
local BLOCK_SIZE = DATA_MODULE.ChunkSettings.BlockSize



local FREQUENCY_SCALE = 50
local AMPLITUDE_ = 20
local NOISE_AVERAGE = 0
local AB = 0 
local BC = 0 
local AC = 0
local DENSITY = 0
local OCTAVES = 4
local LACUNARITY = 3
local PERSISTENCE = 0.35




local function Perlin(X,Y,Z,octaves,lacunarity,persistance)
	

	 AB = math.noise(Y/FREQUENCY_SCALE,Z/FREQUENCY_SCALE,12545)*AMPLITUDE_
	 BC = math.noise(X/FREQUENCY_SCALE,Z/FREQUENCY_SCALE,12545)*AMPLITUDE_
	 AC = math.noise(X/FREQUENCY_SCALE,Y/FREQUENCY_SCALE,12545)*AMPLITUDE_
	
	BLOCK_VECTOR = Vector3.new(X,Y,Z)
	NOISE_AVERAGE =AB+BC+AC+Y

	return NOISE_AVERAGE
	
end


local function CreateChunk(BLOCKSIZE,DYNAMIC_POS,DYNAMIC_POS_2,STATIC_POS,CHUNK_NUM,BLOCK_NUM)
	DYNAMIC_POS_2 = DYNAMIC_POS + Vector3.new(STATIC_POS,0,STATIC_POS)
	
	ERROR_MODULE.ChunkSettings(DYNAMIC_POS,DYNAMIC_POS_2,BLOCKSIZE)

	
	local X_Z_POSITION = math.floor(math.abs((((DYNAMIC_POS-DYNAMIC_POS_2)/BLOCKSIZE).X)))
	
	local Y_POSITION = DATA_MODULE.ChunkSettings.ChunkHeight
	
	local ModPos = DYNAMIC_POS
	local ModPos2  = DYNAMIC_POS_2 
	local MULTIPLICATION_X_VALUE = 1
	local MULTIPLICATION_Z_VALUE = 1
	
	if ModPos.X>ModPos2.X then
		MULTIPLICATION_X_VALUE = -1		

	end
	if ModPos.Z>ModPos2.Z then
		MULTIPLICATION_Z_VALUE = -1		
	end

		
	
	for Y1 = 1 , Y_POSITION do
	
		for Z1 = 1, X_Z_POSITION do 
			
			for X1=1,X_Z_POSITION do

				DENSITY = Perlin(
					 
					ModPos.X+MULTIPLICATION_X_VALUE*(((X1-1)*BLOCKSIZE)+BLOCKSIZE/2),
					
					ModPos.Y+((Y1-1)*(BLOCKSIZE)+BLOCKSIZE/2),
					
					ModPos.Z+MULTIPLICATION_Z_VALUE*(((Z1-1)*BLOCKSIZE)+BLOCKSIZE/2),

					OCTAVES,

					LACUNARITY,

					PERSISTENCE

				
				)

				if DENSITY<21  then
				
					local block = Instance.new("Part")
					block.Size = Vector3.new(BLOCKSIZE,BLOCKSIZE,BLOCKSIZE)
					block.Position = BLOCK_VECTOR
					block.Parent = game.Workspace
					block.Anchored = true
					BLOCK_NUMBER = BLOCK_NUMBER +1		
					block.Name = "block"..tostring(BLOCK_NUM).."/"..CHUNK_NUM
					end
							
			end
		
		end
		game:GetService("RunService").Heartbeat:Wait()
	end	
end



local function CreateChunkCluster(BLOCK_Size,POS_1,POS_2,RELATIVE_POS,INCREMENT_AMOUNT,CHUNK_NUM,BLOCK_N) 

	
	for ZChunkAmount = 1,10 do
		for XChunkAmount = 1,10 do
			CHUNK_NUM = CHUNK_NUM+1
			CreateChunk(BLOCK_Size,POS_1,POS_2,RELATIVE_POS,CHUNK_NUM,BLOCK_N)
			POS_1 = Vector3.new((POS_1.X+RELATIVE_POS),0,INCREMENT_AMOUNT)	
		
		end
		INCREMENT_AMOUNT = INCREMENT_AMOUNT + RELATIVE_POS
		POS_1 = Vector3.new(0,0,INCREMENT_AMOUNT)
		
	end
	
		
	

end

CreateChunkCluster(
	BLOCK_SIZE,
	STARTING_POSITION,
	DYNAMIC_POSITION,
	RELATIVE_POSITION,
	Z_INCREMENT_AMOUNT,
	CHUNK_NUMBER,
	BLOCK_NUMBER)
1 Like