Light Viewer : Light « 3D « Java






Light Viewer

Light Viewer
/*
 *  @(#)Viewer.java 1.14 02/10/21 13:44:30
 *
 * Copyright (c) 1996-2002 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * - Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 *
 * - Redistribution in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in
 *   the documentation and/or other materials provided with the
 *   distribution.
 *
 * Neither the name of Sun Microsystems, Inc. or the names of
 * contributors may be used to endorse or promote products derived
 * from this software without specific prior written permission.
 *
 * This software is provided "AS IS," without a warranty of any
 * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
 * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
 * EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
 * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
 * DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN
 * OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
 * FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
 * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
 * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE,
 * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 *
 * You acknowledge that Software is not designed,licensed or intended
 * for use in the design, construction, operation or maintenance of
 * any nuclear facility.
 */

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;

import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.View;
import javax.vecmath.Matrix4d;

import com.sun.j3d.loaders.Loader;
import com.sun.j3d.loaders.Scene;
import com.sun.j3d.loaders.lw3d.Lw3dLoader;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.SimpleUniverse;

/**
 * This class loads in a Lightwave3D file and displays it in an applet window.
 * The application is fairly basic; a more complete version of a Lightwave 3D
 * loader might incorporate features such as settable clip plane distances and
 * animated views (these are both possible with the current Lightwave 3D loader,
 * they just need to be implemented in the application).
 */
public class Viewer3D extends Applet {

  private java.net.URL filename;

  private SimpleUniverse u;

  public Viewer3D(java.net.URL url) {
    filename = url;
  }

  public Viewer3D() {
  }

  public void init() {
    if (filename == null) {
      // the path to the file for an applet
      try {
        java.net.URL path = getCodeBase();
        filename = new java.net.URL(path.toString() + "./ballcone.lws");
      } catch (java.net.MalformedURLException ex) {
        System.err.println(ex.getMessage());
        ex.printStackTrace();
        System.exit(1);
      }
    }

    // Construct the Lw3d loader and load the file
    Loader lw3dLoader = new Lw3dLoader(Loader.LOAD_ALL);
    Scene loaderScene = null;
    try {
      loaderScene = lw3dLoader.load(filename);
    } catch (Exception e) {
      e.printStackTrace();
      System.exit(1);
    }

    // Construct the applet canvas
    setLayout(new BorderLayout());
    GraphicsConfiguration config = SimpleUniverse
        .getPreferredConfiguration();

    Canvas3D c = new Canvas3D(config);
    add("Center", c);

    // Create a basic universe setup and the root of our scene
    u = new SimpleUniverse(c);
    BranchGroup sceneRoot = new BranchGroup();

    // Change the back clip distance; the default is small for
    // some lw3d worlds
    View theView = u.getViewer().getView();
    theView.setBackClipDistance(50000f);

    // Now add the scene graph defined in the lw3d file
    if (loaderScene.getSceneGroup() != null) {
      // Instead of using the default view location (which may be
      // completely bogus for the particular file you're loading),
      // let's use the initial view from the file. We can get
      // this by getting the view groups from the scene (there's
      // only one for Lightwave 3D), then using the inverse of the
      // transform on that view as the transform for the entire scene.

      // First, get the view groups (shouldn't be null unless there
      // was something wrong in the load
      TransformGroup viewGroups[] = loaderScene.getViewGroups();

      // Get the Transform3D from the view and invert it
      Transform3D t = new Transform3D();
      viewGroups[0].getTransform(t);
      Matrix4d m = new Matrix4d();
      t.get(m);
      m.invert();
      t.set(m);

      // Now we've got the transform we want. Create an
      // appropriate TransformGroup and parent the scene to it.
      // Then insert the new group into the main BranchGroup.
      TransformGroup sceneTransform = new TransformGroup(t);
      sceneTransform.addChild(loaderScene.getSceneGroup());
      sceneRoot.addChild(sceneTransform);
    }

    // Make the scene graph live by inserting the root into the universe
    u.addBranchGraph(sceneRoot);
  }

  public void destroy() {
    u.cleanup();
  }

  /**
   * The main method of the application takes one argument in the args array;
   * the filname that you want to load. Note that the file must be reachable
   * from the directory in which you're running this application.
   */
  public static void main(String args[]) {
    java.net.URL url = null;
    java.net.URL pathUrl = null;
    if (args.length > 0) {
      try {
        if ((args[0].indexOf("file:") == 0)
            || (args[0].indexOf("http") == 0)) {
          url = new java.net.URL(args[0]);
        } else if (args[0].charAt(0) != '/') {
          url = new java.net.URL("file:./" + args[0]);
        } else {
          url = new java.net.URL("file:" + args[0]);
        }
      } catch (java.net.MalformedURLException ex) {
        System.err.println(ex.getMessage());
        ex.printStackTrace();
        System.exit(1);
      }
    } else {
      // the path to the image for an application
      try {
        url = new java.net.URL("file:./ballcone.lws");
      } catch (java.net.MalformedURLException ex) {
        System.err.println(ex.getMessage());
        ex.printStackTrace();
        System.exit(1);
      }
    }
    new MainFrame(new Viewer3D(url), 500, 500);
  }
}





           
       








Lightwave.zip( 11 k)

Related examples in the same category

1.Light DemoLight Demo
2.Creates an ambient light and a one directional lightCreates an ambient light and a one directional light
3.This builds a red sphere using the Sphere utility class and adds lightsThis builds a red sphere using the Sphere utility class and adds lights
4.ExDirectionalLight - illustrate use of directional lightsExDirectionalLight - illustrate use of directional lights
5.ExAmbientLight - illustrate use of ambient lightsExAmbientLight - illustrate use of ambient lights
6.ExPointLight - illustrate use of point lightsExPointLight - illustrate use of point lights
7.ExLightScope - illustrate use of light scope groupsExLightScope - illustrate use of light scope groups
8.Illustrate use of light influencing bounds, and bounding leaves Illustrate use of light influencing bounds, and bounding leaves
9.ExSpotLight - illustrate use of spot lightsExSpotLight - illustrate use of spot lights
10.AmbientLight, DirectionalLight, PointLight and SpotLightAmbientLight, DirectionalLight, PointLight and SpotLight
11.Lighting PlaneLighting Plane
12.Spot LightSpot Light
13.LightScopeApp creates a scene that is paritally lightLightScopeApp creates a scene that is paritally light
14.Light BugLight Bug