Introduction to Java 3D 1 1. Java 3D Overview API for 3D applications Portable 2 Some Application Areas Scientific/Medical/Data visualization Geographical information systems (GIS) Computer-aided design (CAD) Simulation Computer-aided education (CAE) Games 3 The Java 3D API Packages – – – – related to the Java 3D API: Core classes: javax.media.j3d Utility classes: com.sun.j3d.utils Math classes: javax.vecmath AWT classes: javax.swing 4 Introduction Elements of the rendering – Objects – Camera/View – Canvas/Screen 5 Introduction Rendering Camera / objects may move in time… 6 Scene Representation Scene – Representation of elements in the virtual world – How to represent? – What to represent? 7 The Virtual Universe Basics Scene Graph Locales Content Branch View Branch 8 2. What is a Scene Graph? scene graph = tree-like stores,3D scene easier than OpenGL or DirectX. 9 Scene Graph Symbols Nodes and Node Components (objects) Group =erase head Arcs (object relationships) Parent-child link Leaf=cone head Node Component Reference Other objects=block head 10 Java3D’s SceneGraph VitualUniverse Locale Root group robot arm BG TG TG Group = erase head TG TG S S environment BG TG base sphere view S bottom arm S up arm 11 The Virtual Universe Objectives Know what a virtual universe and a scene graph is. Understand the basic parts and elements of a scene graph. Know the basic recipe for a Java 3D program. 12 Leaf=cone head Content Branch A Typical Scene Graph View Branch 13 The Virtual Universe Basics A virtual universe can be seen as a 1:1 representation of our own universe. Represent structures from astronomical to subatomic. – Floating point 3D space: 2^256 (!!) for each x,y,z. – Decimal point for 1 meter at 2^128 – There is one VU-instance only (Singleton). 14 The Virtual Universe Locales (1) How to handle the huge extend of a virtual universe efficiently? Our virtual universe contains at least one Locale. The locale is a 3D-reference point inside the virtual universe. 15 The Virtual Universe Locales (2) Standard Locale resides at (0,0,0) in the VU. We can have several Locales, eg: – One as reference point of the swiss coordinate system (located in Bordeaux, France). – A second as the architects reference point of a building plan. – The both are related, but depending on the point of view it is more convenient (and precise) to work with one or the other. 16 The Virtual Universe Content Branch (1) Contains all „visible“ objects of our scene. Contains all transformations for those objects (displacement, animation, ...). We distinguish between group nodes and leaf nodes (see following slide). 17 The Virtual Universe Content Branch (2) The most common object types Branch Group ... Transform Group ... Appearance Shape3D 18 VirtualUniverse The Virtual Universe Scene Graph (1) Locale Scene Graph is the graphical representation of the objects in our VU. Directed Acyclic Graph (Tree) – Nodes, arcs, parents, childs, leaves, references and other objects. NodeComponent Group Link Leaf Reference Other objects 19 The Virtual Universe Scene Graph (2) A Java 3D program may have more objects than those in the scene graph. A scene graph drawing is the correct documentation for the 3D part of a Java 3D program. 20 The Virtual Universe View Branch The Canvas3D will be inserted in our application or applet -> most important! 21 The Virtual Universe Recipe for a simple Program 1. 2. 3. 4. Create a Frame & a Canvas3D instance Create a SimpleUniverse Construct the content branch. Insert the content branch into the Locale of the SimpleUniverse. 22 Hello World 23 Hello World Source Code public class HelloJava3Da extends Applet { public HelloJava3Da() { setLayout(new BorderLayout()); Canvas3D canvas3D = new Canvas3D(null); add("Center", canvas3D); SimpleUniverse simpleU = new SimpleUniverse(canvas3D); simpleU.getViewingPlatform().setNominalViewingTransform(); BranchGroup scene = createSceneGraph(); simpleU.addBranchGraph(scene); } public BranchGroup createSceneGraph() { BranchGroup objRoot = new BranchGroup(); objRoot.addChild(new ColorCube(0.4)); return objRoot; } public static void main(String[] args) { Frame frame = new MainFrame(new HelloJava3Da(), 256, 256); } } 24 Hello World Class Diagram of HelloJava3D 25 Hello World What happens when running? while (true) { Process input Perform Behaviours //none at the moment Traverse scene graph and render visual objects if (request to exit) break } Cleanup and exit 26 Scene Graph 27 Java3D (cont.) • The scene graph is a tree • Elements of the scene that have some data component, such as viewable objects, light sources, camera locations and so forth are contained in the graph nodes. From: “The Java 3D Tutorial” by Dennis J Bouvier at java.sun.com/products/java-media/3D/collateral and http://www.itk.ilstu.edu/faculty/javila/ITk356/Java3D/scene_graph_basics.htm 28 Symbols representing Scene Graph Objects: Virtual Universe (V) Locale (L) Group (B or T) Leaf (Lf) Node Component (N) Other Objects 29 Scene Graph Viewing Objects Canvas3D, Screen3D, View, PhysicalBody, PhysicalEnvironment. From: “The Java 3D Tutorial” by Dennis J Bouvier at java.sun.com/products/java-media/3D/collateral and http://www.itk.ilstu.edu/faculty/javila/ITk356/Java3D/scene_graph_basics.htm 30 Java3D (cont.) Terminology The renderer 31 Code (create robot arm) public void init() // applet’s init() function { setLayout(new BorderLayout()); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); Canvas3D c = new Canvas3D(config); add("Center", c); // create simple universe( camera, lights, ...) u = new SimpleUniverse(c); // This will move the ViewPlatform back a bit so the // objects in the scene can be viewed. u.getViewingPlatform().setNominalViewingTransform(); viewTrans = u.getViewingPlatform().getViewPlatformTransform(); // Create a robot arm createSceneGraph(); // add root group u.addBranchGraph(rootGroup); } 32 public void createSceneGraph() { // create root rootGroup = new BranchGroup(); rootTrans = new TransformGroup(); rootTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); rootTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); // create bounds BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0); // create Appearance Appearance greenLook = new Appearance(); ColoringAttributes greenColorAttr = new ColoringAttributes(); greenColorAttr.setColor(new Color3f(0.0f,1.0f,0.0f)); greenLook.setColoringAttributes(greenColorAttr); // create Sphere sphereTrans = new TransformGroup(); sphere = new Sphere(0.1f,redLook); 33 // transform sphere Transform3D sphereT3d = new Transform3D(); sphereT3d.setTranslation(new Vector3f(0.5f,0.0f,0.0f)); sphereTrans.setTransform(sphereT3d); // add sphere into scenegraph sphereTrans.addChild(sphere); rootTrans.addChild(sphereTrans); // create arm ….. } // end of createSceneGraph() 34 3. A Java 3D Skeleton All our Java 3D programs embed a scene inside a JPanel, which is part of a JFrame – this allows Swing GUI controls to be utilized along side the Java 3D panel (if necessary) We will develop an example called Checkers3D during the course of these slides. 35 Checkers3D The scene consists of – a dark green and blue tiled surface (and red center) – labels along the X and Z axes – a blue background – a floating sphere lit from two different directions – the user (viewer) can move through the scene by moving the mouse 36 Checkers3D.java public class Checkers3D extends JFrame { public Checkers3D() { super("Checkers3D"); Container c = getContentPane(); c.setLayout( new BorderLayout() ); WrapCheckers3D w3d = new WrapCheckers3D(); // panel holding the 3D scene c.add(w3d, BorderLayout.CENTER); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); pack(); setResizable(false); // fixed size display show(); } // end of Checkers3D() public static void main(String[] args) { new Checkers3D(); } } // end of Checkers3D class 37 Scene Graph for Checkers3D view branch not shown 38 Building the Scene Graph The VirtualUniverse, Locale, and view branch graph often have the same structure across different applications – programmers usually create them with the SimpleUniverse utility class 39 WrapChecker3D Constructor private SimpleUniverse su; private BranchGroup sceneBG; // for content branch private BoundingSphere bounds; : public WrapCheckers3D() { setLayout( new BorderLayout() ); setOpaque( false ); setPreferredSize( new Dimension(PWIDTH, PHEIGHT)); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas3D = new Canvas3D(config); add("Center", canvas3D); canvas3D.setFocusable(true); canvas3D.requestFocus(); su = new SimpleUniverse(canvas3D); : 40 createSceneGraph(); initUserPosition(); // set user's viewpoint orbitControls(canvas3D); // controls for moving the viewpoint su.addBranchGraph( sceneBG ); } // end of WrapCheckers3D() 41 createSceneGraph() private void createSceneGraph() // initilise the scene below sceneBG { sceneBG = new BranchGroup(); bounds = new BoundingSphere(new Point3d(0,0,0), BOUNDSIZE); lightScene(); // add the light addBackground(); // add the sky sceneBG.addChild( new CheckerFloor().getBG() ); // add the floor floatingSphere(); // add the floating sphere sceneBG.compile(); // fix the scene } // end of createSceneGraph() 42 1. Checkers3D Again The scene consists of – a dark green and blue tiled surface (and red center) – labels along the X and Z axes – a blue background – a floating sphere lit from two different directions – the user (viewer) can move through the scene by moving the mouse 43 Scene Graph for Checkers3D view branch not shown 44 WrapChecker3D Constructor private SimpleUniverse su; private BranchGroup sceneBG; // for content branch private BoundingSphere bounds; : public WrapCheckers3D() { setLayout( new BorderLayout() ); setOpaque( false ); setPreferredSize( new Dimension(PWIDTH, PHEIGHT)); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas3D = new Canvas3D(config); add("Center", canvas3D); canvas3D.setFocusable(true); canvas3D.requestFocus(); su = new SimpleUniverse(canvas3D); : 45 createSceneGraph(); initUserPosition(); // set user's viewpoint orbitControls(canvas3D); // controls for moving the viewpoint su.addBranchGraph( sceneBG ); } // end of WrapCheckers3D() 46 createSceneGraph() private void createSceneGraph() // initilise the scene below sceneBG { sceneBG = new BranchGroup(); bounds = new BoundingSphere(new Point3d(0,0,0), BOUNDSIZE); lightScene(); // add the light addBackground(); // add the sky sceneBG.addChild( new CheckerFloor().getBG() ); // add the BranchGroup for the floor floatingSphere(); // add the floating sphere sceneBG.compile(); // fix the scene } // end of createSceneGraph() 47 2. The Floor The floor is made of tiles created with the our ColouredTiles class, and axis labels made with the Text2D utility class. 48 Floor Branch of the Scene Graph floorBG axisTG 49 CheckerFloor Constructor // constants for various colours : private BranchGroup floorBG; public CheckerFloor() // create tiles, add origin marker, // then the axes labels { ArrayList blueCoords = new ArrayList() ArrayList greenCoords = new ArrayList(); floorBG = new BranchGroup(); : 50 boolean isBlue; for(int z = -FLOOR_LEN/2; z <= (FLOOR_LEN/2)-1; z++) { isBlue = (z%2 == 0)? true : false; // set colour for new row for(int x = -FLOOR_LEN/2; x <= (FLOOR_LEN/2)-1; x++) { if (isBlue) createCoords(x, z, blueCoords); else createCoords(x, z, greenCoords); isBlue = !isBlue; } } : 51 floorBG.addChild( new ColouredTiles(blueCoords, blue) ); floorBG.addChild( new ColouredTiles(greenCoords, green) ); addOriginMarker(); labelAxes(); } // end of CheckerFloor() public BranchGroup getBG() { return floorBG; } 52 private void createCoords(int x, int z, ArrayList coords) // Coords for a single blue or green square, // its left hand corner at (x,0,z) { // points created in counter-clockwise order Point3f p1 = new Point3f(x, 0.0f, z+1.0f); Point3f p2 = new Point3f(x+1.0f,0.0f,z+1.0f); Point3f p3 = new Point3f(x+1.0f, 0.0f, z); Point3f p4 = new Point3f(x, 0.0f, z); coords.add(p1); coords.add(p2); coords.add(p3); coords.add(p4); } // end of createCoords() p3 p4 +x p1 p2 +z 53 ColouredTiles Class The ColouredTiles class extends Shape3D, and defines the geometry and appearance of tiles with the same colour. The geometry uses a QuadArray to represent the tiles as a series of quadlilaterals. v4 v1 v3 v8 v2 v5 v7 v6 54 QuadArray Creation The constructor is: QuadArray(int vertexCount, int vertexFormat); In ColouredTiles, the QuadArray plane is created using: plane = new QuadArray( coords.size(), GeometryArray.COORDINATES | GeometryArray.COLOR_3 ); 55 Filling the QuadArray // coordinate data int numPoints = coords.size(); Point3f[] points = new Point3f[numPoints]; coords.toArray( points ); // ArrayList-->array plane.setCoordinates(0, points); // colour data Color3f cols[] = new Color3f[numPoints]; for(int i=0; i < numPoints; i++) cols[i] = col; plane.setColors(0, cols); 56 Issues Counter-clockwise specification of the vertices for each quad – makes the top of the quad its 'front' Ensure that each quad is a convex, planar polygon. Normals or no normals? 57 Unreflecting Colour You can specify a shape's colour in three ways: – in the shape's material when the scene is illuminated – in the shape's colouring attributes used when the shape is unreflecting – in the vertices of the shape's geometry also for unreflecting shapes (used here) 58 The Axes Each axis value is a Text2D object, which specifies the string, colour, font, point size, and font style: Text2D message = new Text2D("...", white, "SansSerif", 36, Font.BOLD ); // 36 point bold Sans Serif 59 Positioning an Axis Value TransformGroup axisTG = new TransformGroup(); Transform3D t3d = new Transform3D(); t3d.setTranslation( vertex ); // vertex is the position for the label axisTG.setTransform(t3d); axisTG.addChild( message ); 60 Create a color cube Prompt the user for an image, list unique colors in the image and then Create a sphere for each color such that: – The sphere has that color – The sphere is positioned in 3space according to its color – The color space is an RGB space. 61