Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Generate 3D perlin noise octaves into workspace.Terrain not working?

Asked by
Elttob 15
10 years ago

After looking this up in countless places, I've got some base code down, but it simply crashes my Roblox Studio. So obviously it's not working.

After debugging to no avail, I decided to try and find an answer here. However, I did find out that the Noise Generators were fine, but the errors came in the script attempting to generate that noise into workspace.Terrain.

Here's my aim:

  • Generate Perlin Noise.

  • Apply octaves to that noise.

  • Use the resulting noise to generate terrain to workspace.Terrain.

However, that just won't happen.

Here is the numerous scripts attempting to do this:

NoiseGeneratorPerlin:

function noise(x, y, z) 
  local X = math.floor(x % 255)
  local Y = math.floor(y % 255)
  local Z = math.floor(z % 255)
  x = x - math.floor(x)
  y = y - math.floor(y)
  z = z - math.floor(z)
  local u = fade(x)
  local v = fade(y)
  local w = fade(z)

  A   = p[X  ]+Y
  AA  = p[A]+Z
  AB  = p[A+1]+Z
  B   = p[X+1]+Y
  BA  = p[B]+Z
  BB  = p[B+1]+Z

  return lerp(w, lerp(v, lerp(u, grad(p[AA  ], x  , y  , z   ), 
                                 grad(p[BA  ], x-1, y  , z   )), 
                         lerp(u, grad(p[AB  ], x  , y-1, z   ), 
                                 grad(p[BB  ], x-1, y-1, z   ))),
                 lerp(v, lerp(u, grad(p[AA+1], x  , y  , z-1 ),  
                                 grad(p[BA+1], x-1, y  , z-1 )),
                         lerp(u, grad(p[AB+1], x  , y-1, z-1 ),
                                 grad(p[BB+1], x-1, y-1, z-1 )))
  )
end


function fade(t)
  return t * t * t * (t * (t * 6 - 15) + 10)
end


function lerp(t,a,b)
  return a + t * (b - a)
end


function grad(hash,x,y,z)
  local h = hash % 16
  local u 
  local v 

  if (h<8) then u = x else u = y end
  if (h<4) then v = y elseif (h==12 or h==14) then v=x else v=z end
  local r

  if ((h%2) == 0) then r=u else r=-u end
  if ((h%4) == 0) then r=r+v else r=r-v end
  return r
end


p = {}
local permutation = {151,160,137,91,90,15,
  131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
  190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
  88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
  77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
  102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
  135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
  5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
  223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
  129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
  251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
  49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
  138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180
}

for i=0,255 do
  p[i] = permutation[i+1]
  p[256+i] = permutation[i+1]
end

function script.GetNoise.OnInvoke(x,y,z,smoothness)

    return noise(x/smoothness,y/smoothness,z/smoothness)

end

NoiseGeneratorPerlinOctaves:

function noise(x,y,z)

    return workspace.NoiseGeneratorPerlin.GetNoise:Invoke(x,y,z,25)

end

function fBm(x, y,z,octaves,lacunarity,gain)
    amplitude = 1.0
    frequency = 1.0
    sum = 0.0
    for i = 0, octaves do

        sum = sum + (amplitude * noise(x * frequency, y * frequency, z * frequency))
        amplitude = amplitude * gain
        frequency = frequency * lacunarity
end
    return sum;
end

function script.GetNoise.OnInvoke(x,y,z,octaves)

    return fBm(x,y,z,octaves,2,0.5)

end

and GenLayerTerrain:


function noise(x,y,z) return workspace.NoiseGeneratorPerlin.GetNoise:Invoke(x,y,z,20) end function generateVoxels(mapScale,mapHeight) local smoothness = math.random(20, 30) local xo = math.random(1000) local zo = math.random(1000) local t = workspace.Terrain for x = 1, mapScale do wait() for z = 1, mapScale do local height = noise(x+xo, z+zo, 0) --Find out the height for y = 1, (height*mapHeight)+10 do local density = noise(x+xo, y, z+zo) --Find out the density if density*10 > 0 then t:SetCell(x-(mapScale/2), y-(mapScale/2), z-(mapScale/2), 1, 0, 0) --Sets cell at position x, y, z end end end end end function script.GenerateRandom.OnInvoke(mapScale,mapHeight) math.randomseed(tick()) generateVoxels(mapScale,mapHeight) end function script.GenerateSeed.OnInvoke(mapScale,mapHeight,seed) math.randomseed(seed) generateVoxels(mapScale,mapHeight) end

Other information:

  • All of the BindableFunctions exist

  • I was using the Command bar to Invoke the BindableFunctions

  • I could not find any forms of "while true do" infinite loops.

Thanks for helping!

0
oh hell nah u probably wrote the entirety of math.noise greatneil80 2647 — 1y

Answer this question