For the past week I've been researching the Marching Cubes algorithm. I hope to use this for Terrain as it would allow the creation of destruction of terrain. After looking at source code and reading many articles I decided to try compiling some of it myself and playing around with it to attempt to make terrain. However, It's giving me a headache and I can't seem to find any good resources on how to do it.


This is from the example found here - http://www.angelfire.com/linux/myp/MC/

The sourcecode relevant can be found on the website.

I added the source code to my project and converted all the code to be used with OpenGL 3.2. However, I don't want to be using this code in my final project. (This is just so I can understand it). I'm having trouble understanding the code. I feel I understand the algorithm now but I can't seem to understand how the object is actually formed.

How can I change this object to create terrain? Are there any better resources on the internet? Thanks in advance.


closed as too broad by Patrick Hughes, Nicol Bolas, bummzack, Anko, Sean Middleditch Aug 19 '13 at 23:10

Please edit the question to limit it to a specific problem with enough detail to identify an adequate answer. Avoid asking multiple distinct questions at once. See the How to Ask page for help clarifying this question. If this question can be reworded to fit the rules in the help center, please edit the question.


Marching cubes is an algorithm for polygonizing an implicit surface - i.e. one defined by an equation of the form f(x, y, z) = 0. You can evaluate any function f(x, y, z) you like, and the algorithm tries to make a polygonal model of the surface formed by the points where the function is zero.

I haven't looked at the source code, but from the screenshot, the test object looks like a metaball, which is a common application of marching cubes. You could perhaps sculpt your terrain out of metaballs.

Another approach, perhaps better suited for terrain, would be to use a noise function like Perlin noise. 3D noise by itself will just make 3D blobs, but to make it more terrain-like, you could use 2D noise and set f(x, y, z) = noise(x, y) - z.

You can combine noise-based terrain with metaballs, too, just by adding their functions together. Therefore you could use metaballs to add additional terrain, or negative-weight metaballs to hollow out caves or destroy terrain.

  • \$\begingroup\$ Thanks, However, I'm having trouble understanding how to manipulate the balls to make terrain. The code responsible for making the balls basically creates a vector - (glm::vec3 dp1 = glm::vec3( 0.0, -2.0, 0.0)-p;) This vector is the location of the ball in respect to the grid. Then it returns a Field Value - return 1/sqrt(dp1.x*dp1.x + dp1.y * dp1.y + dp1.z * dp1.z). Like this. This is the value which is sent to the algorithm. How does this value relate to the f(x,y,z) = 0? \$\endgroup\$ – Vangoule Aug 19 '13 at 2:27
  • \$\begingroup\$ (0, -2, 0) is the center of the metaball, and the field value (the f(x,y,z)) being returned is one over the distance from the center. By itself this makes a spherical surface, but when multiple metaballs are added together their fields combine and make the "melted", blobby shape characteristic of metaballs. \$\endgroup\$ – Nathan Reed Aug 19 '13 at 5:03
  • \$\begingroup\$ As an addition to this answer here is a good article aboutmarching cubes terrain, that might help you understand it and manipulate it. GPU Gems 3-1 \$\endgroup\$ – akaltar Aug 19 '13 at 8:41
  • \$\begingroup\$ GPU Gems uses something they call a 'Density' function. Is this relatable to my metaballs or is it something completely different? \$\endgroup\$ – Vangoule Aug 19 '13 at 15:47
  • \$\begingroup\$ Yes, the density function is the f(x, y, z) we've been talking about. \$\endgroup\$ – Nathan Reed Aug 19 '13 at 16:53

Not the answer you're looking for? Browse other questions tagged or ask your own question.