Making 3D Scenery


Scenery Creation

WrapTerra3D sets up the lighting and background, creates a Landscape object, and initializes the KeyControl object for managing user navigation. The background code sets the sky to be medium blue, with stars added to its geometry:

     private void addBackground( )     { Background back = new Background( );       back.setApplicationBounds( bounds );       back.setColor(0.17f, 0.50f, 0.92f);       back.setGeometry( addStars( ) );       sceneBG.addChild( back );     }

The background geometry can be any type of Group node, but there are some restrictions on the shapes held inside the group. For example, Shape3D is fine, but OrientedShape3D is prohibited. The geometry is restricted to a unit sphere but drawn as if located at infinity.

addStars( ) creates a PointArray of coordinates at random places in the hemisphere above the XZ plane (there's no reason to have stars below the horizon). The colors of the points are randomly chosen:

     private BranchGroup addStars( )     {       PointArray starField =  new PointArray(NUM_STARS,                    PointArray.COORDINATES |  PointArray.COLOR_3);       float[] pt = new float[3];       float[] brightness = new float[3];       Random rand = new Random( );       for (int i=0; i < NUM_STARS; i++) {         pt[0] = (rand.nextInt(2) == 0) ? -rand.nextFloat( ) : rand.nextFloat( );         pt[1] = rand.nextFloat( );     // only above the XZ plane         pt[2] = (rand.nextInt(2) == 0) ? -rand.nextFloat( ) : rand.nextFloat( );         starField.setCoordinate(i, pt);         float mag = rand.nextFloat( );         brightness[0] = mag;         brightness[1] = mag;         brightness[2] = mag;         starField.setColor(i, brightness);       }       BranchGroup bg = new BranchGroup( );       bg.addChild( new Shape3D(starField) );       return bg;     }  // end of addStars( )

This coding approach was suggested by Kevin Duling in an applet at http://home.earthlink.net/~kduling/Java3D/Stars/.


Setting Up the User's Controls

createUserControls( ) is similar to the same named method in WrapFractalLand3D in Chapter 26; it adjusts the clip distances and sets up the KeyBehavior object. The front clip distance is adjusted to reduce the chance of the terrain being clipped away when the user's viewpoint is close to it.

An additional line sets up depth sorting for transparent objects in the world:

     View view = su.getViewer( ).getView( );     view.setTransparencySortingPolicy(View.TRANSPARENCY_SORT_GEOMETRY);

Sorting multiple transparent objects is necessary in Terra3D since ground cover objects are implemented as transparent GIFs textured over shapes. It's likely that the user's viewpoint will include many overlapping instances of these. The default behavior of Java 3D is to do no depth sorting, which may cause the transparent objects to be drawn in the wrong order, so trees and bushes in the distance are drawn in front of nearer ones.

The trANSPARENCY_SORT_GEOMETRY policy only sorts independent geometries (i.e., each Shape3D object must contain only a single geometry). It won't correctly order multiple geometries in a shape, but I've not used this approach; each ground cover shape holds a single quad covered with an image.



Killer Game Programming in Java
Killer Game Programming in Java
ISBN: 0596007302
EAN: 2147483647
Year: 2006
Pages: 340

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net