Fork me on GitHub

Nectar3D

A 3D Scene Graph Engine in Java

Demo Application

Downloads

Source Code

Documentation

N

ectar3D is a basic 3D graphics toolkit I wrote in 2003 that has many of the usual scene graph engine features, such as fog, flat shading, keyframe animation, modifiable scene graph and pickable scene elements. I'm no longer maintaining this project, however it has been reborn as a JavaScript framework called Guava3D.

Example: A Spinning Cube

Let's use Nectar3D to make this spinning cube, that prints "Hello, World" when you click on it:




First, we'll make a renderer panel and attach a listener to catch mouse events:

SceneRenderer renderer = new AWTSceneRenderer();
renderer.setListener(
    new SceneListener() {
        public void handleEvent(SceneRendererEvent e) {
            if(e.getType() == SceneRendererEvent.MOUSE_PICKED) {              
                PickInfo pickInfo = (PickInfo)e.getData();
                Selector message = pickInfo.getSelector();
                System.out.println(message.toString());
            }
        }
    });

Then we'll configure the renderer with view transform parameters and a background colour:

SceneRendererParams params = new SceneRendererParams();
                             
params.setFrustum(new Volume3(-200.0, -200.0, -300.0, 200.0, 200.0, -100.0));
params.setWindow(new Window2(0, 0, 800, 800));
params.setVPDist(-500.0);
params.setEye(new Point3(0.0, 0.0, 100.0));
params.setLook(new Point3(0.0, 0.0, 0.0));
params.setUp(new vector3(0.0, 1.0, 0.0));
params.setBackgroundColor(new Color(100, 255, 255)); // Light blue

renderer.setParams(params);

Next, we'll make a scene graph using the handy SceneBuilder:

SceneBuilder builder = new SceneBuilder();
builder
   .setErrorHandler(new ErrorHandler() {
       public void handleError(String message) {
           System.out.println("Error building scene: " + message);
       }
   })
   .openEnvironment()
      .addLightSource(new Vector3(1.0, 0.0, 0.0), new Color(60,60,0))
      .addLightSource(new Vector3(1.0, -1.0, 0.0), new Color(100,100,100))
      .openLayer("foreground", true, true, true) // Depthsort, depth-cueing and shading
         .openTransformGroup()
            .rotateY(0.0)
            .rotateX(45.0)
            .openName(new StringSelector("Hello, World!"))
               .openBox(30.0, 30.0, 30.0)
                  .openMaterial()
                     .setEdgeColor(new Color(255,255,0))    // Yellow
                     .setFillColor(new Color(255,0,0))      // Red
                  .close()
               .close()
            .close()
            .openInterpolator(TransformGroup.ROTY_VAL)
               .addKeyFrame(0, 0.0)
               .addKeyFrame(5000, 360.0)                  
            .close()                                  
         .close()                                  
      .close()                              
   .close();                                  

SceneElement  sceneRoot = builder.buildScene();

Finally, we'll hand the scene to the renderer, which will immediately start rendering and animating it:

renderer.setScene(sceneRoot);

Finito!

And there we have it; our cube, spinning happily around it's Y-axis. For something a little more sophisticated, take a look at the CubeGUI example.