Randomly generated terrain?

For those of you who know what Minecraft is, it has inspired me to look at the art of randomly generated maps. Does anyone know if this is possible on Unity?

I never played minecraft but if you use the terrain toolkit and some code it should be possible

I use the terrain toolkit, and it can get pretty random.

Sure is. You can access/set the terrain information through the TerrainData class, and all it takes to get started is a simple noise algorithm. Perlin (or Simplex for speed) is a common starting point. I’ve used 3D Simplex as an experiment in cube-terrain generation like Minecraft and it worked just fine.

Absolutely, terrain gen is one of the main reasons why I’m using unity in the first place.

Vue 8 Heightmaps , World Machine 2 , GEO Control 2

Could you please give me an example of how to do it? I found a Simplex noise code (on wiki no less) but Unity doesn’t seem to like it much. I made a new scene and used the GameObject to create a cube then I tried using a Javascript file and a C# file and neither of them ran the code correctly. It looks like an old code so that’s probably why. Other then creating the cube and adding the code, is there anything else I need to do?

The code I found:

// 3D simplex noise
public static double noise(double xin, double yin, double zin) {
double n0, n1, n2, n3; // Noise contributions from the four corners
// Skew the input space to determine which simplex cell we’re in
final double F3 = 1.0/3.0;
double s = (xin+yin+zin)F3; // Very nice and simple skew factor for 3D
int i = fastfloor(xin+s);
int j = fastfloor(yin+s);
int k = fastfloor(zin+s);
final double G3 = 1.0/6.0; // Very nice and simple unskew factor, too
double t = (i+j+k)G3;
double X0 = i-t; // Unskew the cell origin back to (x,y,z) space
double Y0 = j-t;
double Z0 = k-t;
double x0 = xin-X0; // The x,y,z distances from the cell origin
double y0 = yin-Y0;
double z0 = zin-Z0;
// For the 3D case, the simplex shape is a slightly irregular tetrahedron.
// Determine which simplex we are in.
int i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords
int i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords
if(x0>=y0) {
if(y0>=z0)
{ i1=1; j1=0; k1=0; i2=1; j2=1; k2=0; } // X Y Z order
else if(x0>=z0) { i1=1; j1=0; k1=0; i2=1; j2=0; k2=1; } // X Z Y order
else { i1=0; j1=0; k1=1; i2=1; j2=0; k2=1; } // Z X Y order
}
else { // x0<y0
if(y0<z0) { i1=0; j1=0; k1=1; i2=0; j2=1; k2=1; } // Z Y X order
else if(x0<z0) { i1=0; j1=1; k1=0; i2=0; j2=1; k2=1; } // Y Z X order
else { i1=0; j1=1; k1=0; i2=1; j2=1; k2=0; } // Y X Z order
}
// A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z),
// a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and
// a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where
// c = 1/6.
double x1 = x0 - i1 + G3; // Offsets for second corner in (x,y,z) coords
double y1 = y0 - j1 + G3;
double z1 = z0 - k1 + G3;
double x2 = x0 - i2 + 2.0
G3; // Offsets for third corner in (x,y,z) coords
double y2 = y0 - j2 + 2.0
G3;
double z2 = z0 - k2 + 2.0G3;
double x3 = x0 - 1.0 + 3.0
G3; // Offsets for last corner in (x,y,z) coords
double y3 = y0 - 1.0 + 3.0G3;
double z3 = z0 - 1.0 + 3.0
G3;
// Work out the hashed gradient indices of the four simplex corners
int ii = i 255;
int jj = j 255;
int kk = k 255;
int gi0 = perm[ii+perm[jj+perm[kk]]] % 12;
int gi1 = perm[ii+i1+perm[jj+j1+perm[kk+k1]]] % 12;
int gi2 = perm[ii+i2+perm[jj+j2+perm[kk+k2]]] % 12;
int gi3 = perm[ii+1+perm[jj+1+perm[kk+1]]] % 12;
// Calculate the contribution from the four corners
double t0 = 0.6 - x0x0 - y0y0 - z0z0;
if(t0<0) n0 = 0.0;
else {
t0 = t0;
n0 = t0 * t0 * dot(grad3[gi0], x0, y0, z0);
}
double t1 = 0.6 - x1
x1 - y1
y1 - z1z1;
if(t1<0) n1 = 0.0;
else {
t1 = t1;
n1 = t1 * t1 * dot(grad3[gi1], x1, y1, z1);
}
double t2 = 0.6 - x2
x2 - y2
y2 - z2z2;
if(t2<0) n2 = 0.0;
else {
t2 = t2;
n2 = t2 * t2 * dot(grad3[gi2], x2, y2, z2);
}
double t3 = 0.6 - x3
x3 - y3
y3 - z3*z3;
if(t3<0) n3 = 0.0;
else {
t3 = t3;
n3 = t3 * t3 * dot(grad3[gi3], x3, y3, z3);
}
// Add contributions from each corner to get the final noise value.
// The result is scaled to stay just inside [-1,1]
return 32.0
(n0 + n1 + n2 + n3);

What do you mean when you say “Unity doesn’t seem to like it”? Did you get the noise algorithm to compile? To spit out numbers at you? After that, it’s entirely up to you to actually do something with it - it’s not automagic. Also, I’m not really sure what you’re doing with the cube in your scene?

3D Simplex will give you random noise in all three dimensions, meaning it’s not that great if you want a normal heightmap terrain. For example, if you use 2D noise with a heightmap terrain, you’d plug in an X and Y value and get out a height value. Sometimes you need to scale down coordinates to get a smooth result.

The concept of perlin is you generate 2^x images, resize them together, and than blend them together so it creates a random (yet organic/real) looking noise pattern.
http://forum.unity3d.com/threads/56902-Bilinear-Resizing-code-exampes-(Uscript)

Unity doesn’t offer image resizing by default, so I wrote that up which I use for making my perlin. Read into procedural terrain if it really interests you, a lot of online resources on it.

http://clanbom.com/forum/index.php?topic=70.0
Off-site topic I have when I was making a lot of headway into this.

I’m thinking of it in the wrong way, that’s why I included a cube. I thought the cube would be multiplied by the code into terrain to look like Minecraft. I also added the cube because I thought the script had to be attached to something.

What I meant was the code produced errors. Mostly "need ; " even though a semicolin was already at the end of the line.

I need a step by step tutorial. I’m too new to Unity to be given a piece of code and have me know what to do with it.