Following one man's task of building a virtual world from the comfort of his pajamas. Discusses Procedural Terrain, Vegetation and Architecture generation. Also OpenCL, Voxels and Computer Graphics in general.
Hey, I just found your blog via YouTube and I must say this is one of the coolest projects I've seen in a long time. Keep up the great work, I'll definitely be stopping in again.
Wow, I've finally finished reading through all these entries, and it's just amazing. I'd love to see the final version of this project right now, but sadly I have to wait...
They look marvelous.
Very nice, though they look a little disconnected from the terrain. Is the building texture being generated procedurally yet?
I love this stuff <3
Fantastic!If the building is this big, it gets nasty to put it on pillars though.Are you going to alter the terrain to fit the building as well, or only make the building adapt to the terrain?
First of all - fantastic work so far, I like where this is heading so I will be following your progress. About the ruins - The erosion seems a little too random to me. Could you not do more of a physics simulation to break/erode buildings down 'brick by brick'(simulating where cracks would actually start to appear rather than random) using gravity and weathering and material type? Would this be worth doing? The perfectionist in me wouldn't be able to resist.
@Kevin: Yes, the erosion pattern in these ruins bother me too. But this was produced with a really bland noise. I want to try other types of noise which may result in more natural patterns.Procedural techniques are often very different from simulation. I hope for ruins it will be possible to fake them without having to simulate much.
Interesting. Very fond of the second picture of this set, showing how the building conformed to the surrounding terrain.While differing types of erosion methods may be good, not all erosion of structures produces end results that look entirely natural. Sometimes a bit that seems a little out of place or unusual makes for a better piece of scenery.
I think your first passes at ruins are right on, and have brought you 80% there already, amazing!I agree a modified version of noise will help... I wonder if you could pipe the "removed" volumes from the erosion process into your future rubble algorithm, since they've already been calculated to be removed.Then you could map noise across those volumes for "fractures", apply a rotational noise to each piece and then process them "downward" till they meet a surface. Not sure if them meeting other surfaces will be difficult.Then after it's all done apply some level of smoothing, blending noise to the grown rubble to weather it all.I know you'd do this anyway, but it would be important to have this rubble processing occur prior to ground vegetation/moss generation so you can have some sweet plants growing out of the rubble! Talk about sexy :)Amazing work... I'm hoping you hit a big number on a lottery so you can devote more time to your amazing "hobby", because I want to walk around this world. :)
You mentioned a lack of rubble, and floating bits. Why not just knock the floating parts to the ground?
@MoonBeans: Well it should be as simple as that, but that would require a lot of processing. First you need to detect those parts and realize they are unique entities. Then you need to project them into the ground, but only enough so the bottom of the entity touches it. That could lead to awkward positions where the fragment still appears to magically balance on one single point of contact. So it would need to rotate until enough points of contact are established. This may not even be possible at all, or it would mean the fragment has to roll over a few times until it finds a stable place.All that work for a single fragment. Now multiply this by thousands.I'm thinking it would be better to delete the flying fragments and then generate the rubble wherever it would be stable and also the value of the "ruin noise" function is high.
@MCeperoG: I agree, you'd get more bang for your buck by just deleting hanging artifacts, as you would for floating landscape... unless the world type is wild-fantasy :)Your explanation also shows my suggestion for "rubble" would also probably too computationally expensive...Perhaps you could instead do something like the following (I'm sure this is oversimplifying things):- mark the intersection surfaces on remaining structure where "ruin" was removed since you already calculated them.- approximate the "ruin" volume being removed within a tall low resolution column (like 12mx12m, to save on processing), beginning at approximate ground level and up to some max height like 24m tall.- Then drop all that procedural rubble, with noise and perhaps a scatter orientation toward any intersection points within the column. - And only do this if the column contains the flagged intersections... i.e. what we don't "know was there" never fell to the ground.This could approximate variable sized rubble, based on some of the volume of ruin that was carved out, as well as possibly some orientation as a function of the intersections with remaining structure without getting into simulating anything.Anyway, I'm sure your solution will be far better than this, but it's easy to see how fun a process it is, to think about how to mimic real world with only procedural parameters.
@Jonathan: Yes it is a lot of fun. Especially once you realize you are not bound to concepts like time and causality.For instance you can generate the largest bits of rubble using the very same L-System that generates the building, and do it a the same time. You can do it because you know you will be turning that into ruins later. Then you can subtract the "ruin noise" as usual, which will look natural on the large pieces of rubble too. Ruins of a ruin is still a ruin. And then you can add generic finer rubble wherever both the noise and architecture fields are high.
I can't help but wonder if there's any overlap between rubble and snowdrifts. Seems like the code would be pretty similar (find some corners, stick some content in them at an angle, repeat). It'd be pretty cool to see these ruins in different seasons.
@tentus: Challenge accepted
Is your erosion noise random, or is it weighted somehow? It would make sense if it affected small things more strongly than large things (look at old church ruins, for example), so you could either check for size, or do some sort of thing where you weight the noise so that it's stronger closer to the surface of a volume.
@Naeddyr: It is random for these screenshots. I'm planning to have more interesting noise. What you have described is a good way to weight it.
Hi, love your work. My questions: are these fully dynamic or do they require (any sort of) precomputation?
@beyzend: These are fully static and require a lot of pre-computation.
I was just looking back over your ruin post and thinking about other's comments regarding "seasoning" the man-made landscape with things that make it more realistic, I got to thinking.Of course complete ruins are awesome, and have so much potential for story elements and atmosphere.One suggestion I'd have is to play with whatever ruin code you put together to see if it's parameters can be tweaked to allow "light touches" of decay to whole areas of buildings... to make sure you can use it at all levels of ruin -- not well maintained to extreme collapse :)I think one way to increase realism would be to have towns and villages be able to have arbitrary age parameters (not simulated, just realistically assigned by some criteria), and to have buildings and sections of a "city" have differing levels of pristine/disrepair.Things like decaying alleyways, partially abandoned buildings, roof eaves that are falling apart but would still be livable would all really add a feeling of realism to your world... without building that history in a simulation sense.Just some food for thought!
@Jonathan: Yes I'm going for that. The ruin density can be influenced by many aspects. I want ruins to be an active part of the gameplay. Since they are so large and can be seen from afar, the degradation of buildings will give the player clues about what needs to be done. In some cases it will make sense to go look inside a very old and dilapidated building. In some other cases it will be the opposite. If you are looking for someone, odds are they are in a building with fairly good condition. But I'm getting ahead of myself here.
Great! I also imagine things like "weathering" details like the corners of a building missing chunks but the structure generally being intact... The reason I say this is small details like that applied over large areas of man made buildings is the kind of details that will take Procedural content vs. hand-crafted content.Also, I haven't see anything yet but looking back at the city-borough-structure code, it would go a long way visually to have walls in and around properties and buildings.Nothing implies real people lived somewhere like the wall they put of for "whatever reason" :)Common Types of walls:- Tall rich, keep the plebes out walls around a property.- low stacked cobblestone rows in English pastureland, for large areas.- Earthen berms between large areas, along roads etc... (http://pixdaus.com/single.php?id=143250)- low "this is my patio/courtyard" walls(http://bit.ly/o4eQNr)- Wooden fencesI'm sure you get the idea... :)
Ok,Sorry for repeat posting, but I ran across an inspirational ruin image, by an artist obviously.(http://www.wallpaperstop.com/wallpapers/3d-wallpapers/fantasy-wallpapers/dark-fantasy-wallpaper-1920x1200-0529.html)You'll know you can stop reworking your procedural code when you are generating worlds like, or even remotely near the above image... procedurally :)Honestly, I'm amazed at how good your ruins already look... can't wait to see foliage, moss and more coupled with it ! *rubs hands in anticipation*
@Jonathan: Thanks for the image. I will add it to the list of image references I have collected over the years.As you probably can tell, I'm not an artist. We'll see how far I can go with my programmer art. If the first iteration is successful and I manage to raise some cash, hiring a real artist would be the first thing I do.