Newsletter sign-up
View all newsletters

Enterprise Java Newsletter
Stay up to date on the latest tutorials and Java community news posted on JavaWorld

Sponsored Links

Optimize with a SATA RAID Storage Solution
Range of capacities as low as $1250 per TB. Ideal if you currently rely on servers/disks/JBODs

3D graphics programming in Java: Part 2, Advanced Java 3D

Learn more about Java 3D performance, 3D content loaders, and the Java 3D VRML97 browser

  • Print
  • Feedback

Page 3 of 6

For instance, modifying only the z coordinate of our view platform location from


myViewTransform.setTranslation(new Vector3f(2.0f,0.0f,11.0f));


in Example 4 to


myViewTransform.setTranslation(new Vector3f(2.0f,0.0f,12.0f));


in Example 5, we no longer see the word JavaWorld rotating. Keep this in mind as you develop more complicated and interactive worlds.

Moving our viewing location one unit in the +z direction
moves us out f the bounds, so the text no longer rotates.
We are now outside of the bounding region,
which may or may not be otherwise obvious.

Reusing the world's 3D content

If you were limited to using only content you could manually code into your Java 3D applications, you would either limit yourself to small scene graphs with a few nodes, or relinquish any hope of sleeping ever again. Writing Java 3D code to create complex 3D worlds from scratch is certainly nontrivial. Realizing that such limits aren't good for the success of Java 3D (not to mention your sanity), Sun has made it easy to import from standard 3D file formats into Java 3D using loaders.

Put simply, a loader knows how to read content from a standard 3D file format -- say, for instance, Wavefront's Object file format (OBJ) -- then construct a Java 3D scene from it. There are a variety of loaders available on the Web, including several provided by Sun within the Java 3D release itself. All of them are documented at the Java 3D Loaders archive (see Resources). As of this writing, 17 publicly known Java 3D file loaders are currently available, supporting such common formats as AutoCAD's Drawing Interchange File (DXF), LightWave's Scene Format (LWS) and Object Format (LWO), 3D-Studio's 3DS, and application-specific formats like the Protein Data Bank's PDB.

The world is full of free or commercial archives of 3D content. So, given that loaders and content exist, how do you use them?

Our first loader: Wavefront OBJ content using ObjectFile

Sun has included support for Wavefront's OBJ and LightWave's LightWave 3D file formats built into its implementation of Java 3D. Both formats are fairly prevalent in the modeling and animation community, and both are well specified and understood (again, please refer to the Loaders Archive URL for more information on these formats). I picked the OBJ format to provide a simple example of how to use a loader.

Wavefront OBJ is supported by Sun's com.sun.j3d.utils.loaders.objectfile package. The main class we will use to load and parse the content is ObjectFile, which encapsulates an OBJ file and provides methods to load its content into Java 3D. In the simplest case, we can load in OBJ content with a few lines of code in a modified constructContentBranch() method, as illustrated in Example 6:


001 /**
002 * constructContentBranch() is where we specify the 3D graphics
003 * content to be rendered. Here we read in a cube using
004 * Sun's OBJ loader, then return this to be rendered. This
005 * cube could be replaced with more complicated content exported
006 * from 3D modeling programs supporting the OBJ format.
007 **/
008 private BranchGroup constructContentBranch() {
009 ObjectFile myOBJ = new ObjectFile();
010 Scene myOBJScene = null;
011
012 //Attempt to load in the OBJ content using ObjectFile.
013 try {
014 myOBJScene = myOBJ.load("cube.obj");
015 } catch (FileNotFoundException e) {
016 System.out.println("Could not open OBJ file...exiting");
017 System.exit(1);
018 }
019
020 //Construct and return branch group containing our OBJ scene.
021 BranchGroup contentBranchGroup = new BranchGroup();
022 contentBranchGroup.addChild(myOBJScene.getSceneGroup());
023 return(contentBranchGroup);
024 }


This method will load in the cube data, build a com.sun.j3d.utils.loaders.Scene from it, and use the scene to return a scene group that can be added to the content branch for rendering.

  • Print
  • Feedback

Resources
  • Sun has made its "Java 3D 1.1 Performance Guide" available on its product site. This guide provides some short tips and tricks developers can heed to speed up their Java 3D applications. http://www.sun.com/desktop/java3d/collateral/j3d_perfguide.html
  • The home page for the Java 3D and VRML working group provides links to download the Java 3D VRML browser. http://www.vrml.org/WorkingGroups/vrml-java3d/
  • You can download the Java 3D VRML97 browser from the Java Developer Connection (free registration required). http://developer.java.sun.com/developer/earlyAccess/java3D/index.html
  • VRML97 is an international standard, officially designated ISO/IEC 14772-1:1997. The complete standard specification is available from the VRML Consortium Web site. http://www.vrml.org/Specifications/VRML97/
  • Get information on Transform3D with the API spec and documentation. API specification
    javadocs
  • If you need more information on how transforms are actually applied using matrix mathematics, I recommend the classic computer graphics primer "Introduction to Computer Graphics" (Addison-Wesley, ISBN0201609215). http://www1.clbooks.com/asp/bookinfo/bookinfo.asp?theisbn=0201609215
  • The Java 3D Archive links to loaders and shapes for use with Java 3D. You can use Java 3D loader software to read in models from common 3D file formats and translate them into a scene graph that the Java 3D runtime can render. The archive was assembled through the efforts of Matt Robinson, who has since passed its maintenance on to me. http://reality.sgi.com/bday/Java3DArchives/index.html
  • NCSA's Portfolio provides a consistent interface for loading many popular 3D modeling formats into the Java 3D runtime. It also supports domain-specific loaders for formats such as Protein Data Bank (PDB). Portfolio provides an implementation of Canvas3D, which is able to save snapshots into JPEG files. These files can then be used to make MPEG movies of Java 3D worlds. http://havefun.ncsa.uiuc.edu/Java3D/portfolio/
  • For more on the Java 3D API performance-oriented features, see "Introduction to Programming with Java 3D." http://www.sdsc.edu/~nadeau/Courses/SDSCjava3d/
  • JavaWorld has published several good VRML-related articles. In addition to the two below, be sure to visit the JavaWorld Topical Index for more VRML-related information.
  • "3D computer graphicsGetting the hang of VRML"
  • "Why Java and VRML?"
  • http://www.javaworld.com/topicalindex/jw-ti-vrml.html
  • The Java 3D mailing list archive stores lots of useful tips and tricks. Please search here before posting new questions to the list. http://java.sun.com/products/java-media/mail-archive/3D/index.html
  • Allen McPherson has made some example code available to help in the visual debugging of normal problems. http://java.sun.com/products/java-media/mail-archive/3D/1860.html
  • Learn how to get the frame rate from the Java 3D rendering engine. http://java.sun.com/products/java-media/mail-archive/3D/0093.html
  • Tips on coaxing Java 3D applets to run inside your Web browser. Includes step-by-step instructions for installing and configuring the Java 2 platform (formerly Java 1.2) and Java 3D to work with Netscape's browser. http://java.sun.com/products/java-media/mail-archive/3D/1212.html
  • Need to know the bounding volumes used by the Java 3D VRML97 browser? Try this sample code. http://java.sun.com/products/java-media/mail-archive/3D/1063.html
  • Read about an interesting real-world use of Java 3D and VRML, Nearlife's Virtual Fishtank. The article contains a special sidebar on Java 3D and the fishtank. http://java.sun.com/features/1998/11/fishtank.html
  • Download source code and classes for this column. http://www.javaworld.com/jw-01-1999/media/jw-01-media.jar
  • I've archived Media Programming resources on my Web site. This archive contains the up-to-date media.jar file with code fixes for all the examples in the column. http://reality.sgi.com/bday/Work/index.html
  • Read all my previous Media Programming columns. http://www.javaworld.com/topicalindex/jw-ti-media.html