making of "Shangri La"

This description should give an idea of the working steps and techniques used for creating the "Shangri La" scene. I hope you find this section informative, comments are always welcome.

In this scene i tested various new techniques for forming terrain structures and generating other elements. A lot of them use the new possibilities of POV-Ray 3.5.

Almost everything in the scene is hand coded, the trees and grass i based on maketree and makegrass by external linkGilles Tran. and for parts of the mountain I used data files generated with a self written program.

The pictures shown here are rendered with versions of the scene saved in between so they should give an authentic impression of how the scene was created.

Building the mountains

I started with the right part, a fairly steep mountain slope at a river. It later fills the main foreground part and the right side of the view.

As all the other terrain parts this is an isosurface object which allows detailed control over the shape with the help of mathematical functions and POV-Ray's internal patterns.


The road was planned from the beginning, POV-Ray 3.5 offers the very useful possibility to use splines in isosurface functions and I used this for the road as well as later for the left side river bank.

The spline is designed manually with help of the test scene shown here. I guess using an interactive editor could have some advantages too, but to get the desired result a lot of test were required anyway.


The large scale curving of the road is achieved with a square function and some large scale turbulence. For more specific control a spline could be used here too of course.


Next was the river itself and the opposite side, here as a first draft. You can see the combination of several isosurface objects. Of course making all one object would also be possible, but this way you can adapt the accuracy and max_gradient for every single situation and gain a lot of speed.


After some experiments I decided to use an image file for the basic shape of the mountain on the left, partly simply to try out this method but also to have full control of the shape. When using image maps in isosurface functions it is important to switch on interpolation, otherwise there will be serious problems.

The image file was generated with a self written program at fairly low resolution (512x512) since the fine structure will be made with an additional pigment function anyway.


After that I started working on the fine structure of the terrain, I also placed some provisional blocks at the road with the help of trace and the isosurface function.

The terrain structure is a combination of quite a lot of granite and bozo patterns differently scaled and with various turbulence warps.


I tested quite some different ideas for the left side of the river and decided to use a shape like in this picture. At this stage i also tested some first drafts for the background mountains.

Also the light source is now placed near the final position with the shadow of the left riverbank covering most, but not all of the river.


The detail structure of the foreground, both on the left and on the right side is changed again and now nearly as in the final version apart from some minor changes.

Next thing to add was the central section between foreground and background, a large plane area with a river. The rough shape is a quite simple gradient with some low frequency turbulence for the windings of the river.


This plane consists of two parts (near and far) to speed up the calculations.

The river itself is made as an isosurface object too, The material uses a fairly conventional water finish and scattering media for the muddy appearance. The join of the foreground and background part of the river is not modeled in detail since it won't be visible in the final render.


At this stage I also began coloring of the mountains, since most structure is generated as true geometry the textures are quite plain but they have some variation to emphasize the structure of the rocks.

I also started working on the plants, how they are made follows later on, The placement of the grass patches here is done with loops and with the help of the trace. The decision whether grass is placed at a particular position depends on the local properties of the objects (slope and structure).


Placing the trees worked similar to the grass. They are placed in several groups along the sides of the river. Some bushes are also positioned further away as well as uphill in the foreground.


What's left is some tweaking of the structures, the plane and more distant hills get some additional noise, the background mountains are changed again to look less artificial.

Texturing is done with the slope pattern and some snow at the highest parts. The same texture is used for the nearer hills too.


For the final render everything is put together, area light and higher quality radiosity parameters are added and as the last change the provisional blocks at the road are replaced with an isosurface version.

The render took about 12 days on an Athlon 1GHz, memory use was about 200 Mb for geometry and 100-150 Mb for radiosity data.


The plants

grass sample (6k)

The main speciality of this scenes is the geometry being built of purely isosurfaces and meshes. This helps keeping the memory requirements at a reasonable size despite the fairly complex geometry.

Meshes are used for building all the plants. For the grass i used the external linkmakegrass include file without modifications. The patches are all identical apart from random rotation.

There are altogether 2800 grass patches on the foreground mountains.

The trees and bushes are created with external linkmaketree but i strongly modified the macros for this purpose.

First of all i added intersection tests to the growth code to avoid the bushes intersecting with the steep mountain in the foreground. Of course this technique requires an individually shaped tree for each position so it was only used for the bushes further uphill in the foreground.

tree sample (24k)

In addition i modified the code to generate the tree in form of two large meshes, one for the trunk and twigs, one for the foliage. This made it possible to place a total of several thousand trees in the scene since creating several instances of the same mesh does not need much memory in POV-Ray.

tree sample (14k) tree sample (15k) tree sample (17k)
tree sample (7k) tree sample (15k) tree sample (13k)

Finally the long and slim tree needed some special modification to the growing algorithm since maketree has some serious problems generating such trees.

That's it about this scene, if you have further questions feel free to ask.

Christoph Hormann February 2, 2002