Voici un petit exemple compatible avec la version 0.2.4 de ODEJava (2004) liée à Xith3D pour le rendu. A noter que le chapitre 5 du livre du Dr. Andrew Davison intitulé "Pro Java 6 3D game development: Java 3D, JOGL, JInput, and JOAL APIs" (Apress 2007), dont des extraits sont mis à disposition par Google Books, traite de cette version de la bibliothèque et donc offre un exemple plus complet que celui-ci, lié cependant à Java3D pour le rendu.
package com.cosyhut.jblocks.client.display; import javax.vecmath.*; import java.util.Observable; import java.util.Observer; import java.util.List; // xith import com.cosyhut.jblocks.server.ode.Engine; import com.xith3d.scenegraph.*; import com.xith3d.test.*; import com.xith3d.render.*; import com.xith3d.render.jsr231.*; // Import odejava to xith binder import org.odejava.xith3d.OdejavaToXith3D; import org.odejava.xith3d.Xith3DDisplayObject; import org.odejava.Body; import org.odejava.display.*; public class XithRender implements Observer{ // -- Attributes // Odejava world Engine _engine; View _view; Locale _locale; BranchGroup _scene; Canvas3D _canvas; // Odejava to xith helper class OdejavaToXith3D odejavaToXith; // Each TransformGroup contains xith shapes, these are constantly updated // by Odejava. TransformGroup's userData contains object Odejava.body DisplayBin _boundObjects = new DisplayBin(); // Store car chassis body locally because it is frequently accessed Body _chassisBody; TransformGroup[] _wheelTransformGroup = new TransformGroup[4]; // -- constructor public XithRender() { _engine = Engine.getEngine(); _engine.addObserver(this); odejavaToXith = new OdejavaToXith3D(_boundObjects); // create the virtual universe VirtualUniverse universe = new VirtualUniverse(); // add view to the universe _view = new View(); universe.addView(_view); // add locale _locale = new Locale(); universe.addLocale(_locale); // create scene _scene = new BranchGroup(); _locale.addBranchGraph(_scene); // create canvas for our graphics RenderPeer rp = new RenderPeerImpl(); CanvasPeer cp = rp.makeCanvas(null, 640, 360, 32, false); _canvas = new Canvas3D(); _canvas.set3DPeer(cp); // Set view _view.addCanvas3D(_canvas); // Create xith lights initLights(); // Create xith ground initGround(); // Create xith objects based on Odejava initXithFromOdejava(); } /** * Initialize some lighting to the scene. * */ private void initLights() { Color3f col1 = new Color3f(0.5f, 0.5f, 0.5f); Transform3D t = new Transform3D(); Vector3f pos1 = new Vector3f(0.0f, 0.0f, 30.0f); t.set(pos1); Vector3f dir1 = new Vector3f(pos1); dir1.negate(); dir1.normalize(); DirectionalLight light1 = new DirectionalLight(col1, dir1); _scene.addChild(light1); light1.setEnable(true); } /** * Initialize ground manually. * */ private void initGround() { float k = 100f; // number of texture tiles per narrow side float w = 2000f; // Width of grass line, length = 128*w float x1 = -1000f; float x2 = 1000f; float y = 0f; float z1 = -64f * w; float z2 = 64f * w; float tsx = k * 1f; float tsy = k * 128f; Shape3D shape = new Shape3D(); Geometry geom =TestUtils.createQuad( new Point3f(x1, z1, y), new Point3f(x1, z2, y), new Point3f(x2, z2, y), new Point3f(x2, z1, y), tsx, tsy); // -- set to color... shape.setGeometry(geom); Appearance app = new Appearance(); ColoringAttributes appca = new ColoringAttributes(); appca.setColor(1.0f, 1.0f, 0.9f); app.setColoringAttributes(appca); shape.setAppearance(app); _scene.addChild(shape); } /** * Initialize xith transformgroups with shapes. Use a helper class * OdejavaToXith for creating xith objects from Odejava objects. Set * appearances for chassis, ramp and box objects. Set own transformgroup * (tire and rim shape) for wheel objects. * */ private void initXithFromOdejava() { Appearance cylinderApp = new Appearance(); ColoringAttributes cylinderAppca = new ColoringAttributes(); cylinderAppca.setColor(0.0f, 0.0f, 0.1f); cylinderApp.setColoringAttributes(cylinderAppca); /* LineAttributes cylinderAppla = new LineAttributes(); cylinderAppla.setLineWidth(10); cylinderAppla.setLinePattern(LineAttributes.PATTERN_SOLID); cylinderApp.setLineAttributes(cylinderAppla); */ PolygonAttributes cylinderApppa = new PolygonAttributes(); cylinderApppa.setPolygonMode(PolygonAttributes.POLYGON_LINE); cylinderApp.setPolygonAttributes(cylinderApppa); odejavaToXith.addUserAppearance("cylinder", cylinderApp); // Create transform groups based on given Odejava object odejavaToXith.createTransformGroups(_engine.getGeoms()); Xith3DDisplayObject.addToScene(_boundObjects, _scene); } // -- Observer /* * a real display should ave its on thread so it's refresh rate won't depend on * the engine's rate. later. */ public void update(Observable o, Object arg) { // update xith objects based on Odejava bodies _boundObjects.updateAll(); } /** * Render xith scene after Odejava simulation is step ahead and transform * groups are updated. * */ public void displayRender() { _view.renderOnce(); } public View getView() { return _view; } }