📄 example.java
字号:
/*
*
* Copyright (c) 1998 David R. Nadeau
*
*/
package Java3DApplet;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.io.File;
import com.sun.j3d.utils.universe.*;
/**
* The Example class is a base class extended by example applications.
* The class provides basic features to create a top-level frame, add
* a menubar and Canvas3D, build the universe, set up "examine" and
* "walk" style navigation behaviors, and provide hooks so that
* subclasses can add 3D content to the example's universe.
* <P>
* Using this Example class simplifies the construction of example
* applications, enabling the author to focus upon 3D content and
* not the busywork of creating windows, menus, and universes.
*
* @version 1.0, 98/04/16
* @author David R. Nadeau, San Diego Supercomputer Center
*/
public class Example
extends Applet
implements WindowListener, ActionListener,
ItemListener, CheckboxMenuListener
{
// Navigation types
public final static int Walk = 0;
public final static int Examine = 1;
// public final static int Move = 2;
// Should the scene be compiled?
private boolean shouldCompile = true;
public SimpleUniverse universe = null;
public Group scene = null;
// GUI objects for our subclasses
protected Example example = null;
protected Frame exampleFrame = null;
protected MenuBar exampleMenuBar = null;
protected Canvas3D exampleCanvas = null;
protected TransformGroup exampleViewTransform = null;
protected TransformGroup exampleSceneTransform = null;
protected boolean debug = false;
// Private GUI objects and state
private boolean headlightOnOff = true;
private int navigationType = Examine;
private CheckboxMenuItem headlightMenuItem = null;
private CheckboxMenuItem walkMenuItem = null;
private CheckboxMenuItem examineMenuItem = null;
private DirectionalLight headlight = null;
private ExamineViewerBehavior examineBehavior = null;
private WalkViewerBehavior walkBehavior = null;
public CheckboxMenuItem moveMenuItem = null;
public boolean moveOnOff = true;
//--------------------------------------------------------------
// ADMINISTRATION
//--------------------------------------------------------------
/**
* The main program entry point when invoked as an application.
* Each example application that extends this class must define
* their own main.
*
* @param args a String array of command-line arguments
*/
public static void main( String[] args )
{
Example ex = new Example( );
ex.initialize( args );
ex.buildUniverse( );
ex.showFrame( );
}
/**
* Constructs a new Example object.
*
* @return a new Example that draws no 3D content
*/
///*public Example( )
//{
// // Do nothing
//}*/
/**
* Initializes the application when invoked as an applet.
*/
public void init( )
{
// Collect properties into String array
String[] args = new String[2];
// NOTE: to be done still...
this.initialize( args );
this.buildUniverse( );
this.showFrame( );
// NOTE: add something to the browser page?
}
/**
* Initializes the Example by parsing command-line arguments,
* building an AWT Frame, constructing a menubar, and creating
* the 3D canvas.
*
* @param args a String array of command-line arguments
*/
protected void initialize( String[] args )
{
example = this;
// Parse incoming arguments
//parseArgs( args );
debug = true;
// Build the frame
if ( debug ) System.err.println( "创建界面..." );
exampleFrame = new Frame( );
exampleFrame.setSize( 640, 480 );
exampleFrame.setTitle( "Java 3D 例子" );
exampleFrame.setLayout( new BorderLayout( ) );
// Set up a close behavior
exampleFrame.addWindowListener( this );
// Set up a GraphicsConfiguration
GraphicsConfigTemplate3D template = new GraphicsConfigTemplate3D();
template.setDoubleBuffer(template.REQUIRED);
GraphicsEnvironment env =
GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice dev = env.getDefaultScreenDevice();
GraphicsConfiguration gfxConfig = dev.getBestConfiguration(template);
// Create a canvas
// Canvas3D canvas = new Canvas3D(gfxConfig);
exampleCanvas = new Canvas3D( gfxConfig );
exampleCanvas.setSize( 630, 460 );
exampleFrame.add( "Center", exampleCanvas );
// Build the menubar
exampleMenuBar = this.buildMenuBar( );
exampleFrame.setMenuBar( exampleMenuBar );
// Pack
exampleFrame.pack( );
exampleFrame.validate( );
// exampleFrame.setVisible( true );
}
/**
* Parses incoming command-line arguments. Applications that
* subclass this class may override this method to support
* their own command-line arguments.
*
* @param args a String array of command-line arguments
*/
protected void parseArgs( String[] args )
{
for ( int i = 0; i < args.length; i++ )
{
if ( args[i].equals( "-d" ) )
debug = true;
}
}
//--------------------------------------------------------------
// SCENE CONTENT
//--------------------------------------------------------------
/**
* Builds the 3D universe by constructing a virtual universe
* (via SimpleUniverse), a view platform (via SimpleUniverse), and
* a view (via SimpleUniverse). A headlight is added and a
* set of behaviors initialized to handle navigation types.
*/
protected void buildUniverse( )
{
//
// Create a SimpleUniverse object, which builds:
//
// - a Locale using the given hi-res coordinate origin
//
// - a ViewingPlatform which in turn builds:
// - a MultiTransformGroup with which to move the
// the ViewPlatform about
//
// - a ViewPlatform to hold the view
//
// - a BranchGroup to hold avatar geometry (if any)
//
// - a BranchGroup to hold view platform
// geometry (if any)
//
// - a Viewer which in turn builds:
// - a PhysicalBody which characterizes the user's
// viewing preferences and abilities
//
// - a PhysicalEnvironment which characterizes the
// user's rendering hardware and software
//
// - a JavaSoundMixer which initializes sound
// support within the 3D environment
//
// - a View which renders the scene into a Canvas3D
//
// All of these actions could be done explicitly, but
// using the SimpleUniverse utilities simplifies the code.
//
if ( debug ) System.err.println( "创建场景图..." );
universe = new SimpleUniverse(
null, // Hi-res coordinate for the origin - use default
1, // Number of transforms in MultiTransformGroup
exampleCanvas, // Canvas3D into which to draw
null ); // URL for user configuration file - use defaults
//
// Get the viewer and create an audio device so that
// sound will be enabled in this content.
//
Viewer viewer = universe.getViewer( );
viewer.createAudioDevice( );
//
// Get the viewing platform created by SimpleUniverse.
// From that platform, get the inner-most TransformGroup
// in the MultiTransformGroup. That inner-most group
// contains the ViewPlatform. It is this inner-most
// TransformGroup we need in order to:
//
// - add a "headlight" that always aims forward from
// the viewer
//
// - change the viewing direction in a "walk" style
//
// The inner-most TransformGroup's transform will be
// changed by the walk behavior (when enabled).
//
ViewingPlatform viewingPlatform = universe.getViewingPlatform( );
exampleViewTransform = viewingPlatform.getViewPlatformTransform( );
//
// Create a "headlight" as a forward-facing directional light.
// Set the light's bounds to huge. Since we want the light
// on the viewer's "head", we need the light within the
// TransformGroup containing the ViewPlatform. The
// ViewingPlatform class creates a handy hook to do this
// called "platform geometry". The PlatformGeometry class is
// subclassed off of BranchGroup, and is intended to contain
// a description of the 3D platform itself... PLUS a headlight!
// So, to add the headlight, create a new PlatformGeometry group,
// add the light to it, then add that platform geometry to the
// ViewingPlatform.
//
BoundingSphere allBounds = new BoundingSphere(
new Point3d( 0.0, 0.0, 0.0 ), 100000.0 );
PlatformGeometry pg = new PlatformGeometry( );
headlight = new DirectionalLight( );
headlight.setColor( White );
headlight.setDirection( new Vector3f( 0.0f, 0.0f, -1.0f ) );
headlight.setInfluencingBounds( allBounds );
headlight.setCapability( Light.ALLOW_STATE_WRITE );
pg.addChild( headlight );
viewingPlatform.setPlatformGeometry( pg );
//
// Create the 3D content BranchGroup, containing:
//
// - a TransformGroup who's transform the examine behavior
// will change (when enabled).
//
// - 3D geometry to view
//
// Build the scene root
BranchGroup sceneRoot = new BranchGroup( );
// Build a transform that we can modify
exampleSceneTransform = new TransformGroup( );
exampleSceneTransform.setCapability(
TransformGroup.ALLOW_TRANSFORM_READ );
exampleSceneTransform.setCapability(
TransformGroup.ALLOW_TRANSFORM_WRITE );
exampleSceneTransform.setCapability(
Group.ALLOW_CHILDREN_EXTEND );
exampleSceneTransform.setCapability(Group.ALLOW_CHILDREN_READ);
exampleSceneTransform.setCapability(Group.ALLOW_CHILDREN_WRITE);
//
// Build the scene, add it to the transform, and add
// the transform to the scene root
//
if ( debug ) System.err.println( " 场景..." );
scene = this.buildScene(universe);
exampleSceneTransform.addChild( scene );
sceneRoot.addChild( exampleSceneTransform );
//
// Create a pair of behaviors to implement two navigation
// types:
//
// - "examine": a style where mouse drags rotate about
// the scene's origin as if it is an object under
// examination. This is similar to the "Examine"
// navigation type used by VRML browsers.
//
// - "walk": a style where mouse drags rotate about
// the viewer's center as if the viewer is turning
// about to look at a scene they are in. This is
// similar to the "Walk" navigation type used by
// VRML browsers.
//
// Aim the examine behavior at the scene's TransformGroup
// and add the behavior to the scene root.
//
// Aim the walk behavior at the viewing platform's
// TransformGroup and add the behavior to the scene root.
//
// Enable one (and only one!) of the two behaviors
// depending upon the current navigation type.
//
examineBehavior = new ExamineViewerBehavior(
exampleSceneTransform, // Transform gorup to modify
exampleFrame ); // Parent frame for cusor changes
examineBehavior.setSchedulingBounds( allBounds );
sceneRoot.addChild( examineBehavior );
walkBehavior = new WalkViewerBehavior(
exampleViewTransform, // Transform group to modify
exampleFrame ); // Parent frame for cusor changes
walkBehavior.setSchedulingBounds( allBounds );
sceneRoot.addChild( walkBehavior );
if ( navigationType == Walk )
{
examineBehavior.setEnable( false );
walkBehavior.setEnable( true );
}
else
{
examineBehavior.setEnable( true );
walkBehavior.setEnable( false );
}
//
// Compile the scene branch group and add it to the
// SimpleUniverse.
//
if ( shouldCompile )
sceneRoot.compile( );
universe.addBranchGraph( sceneRoot );
reset( );
}
/**
* Builds the scene. Example application subclasses should replace
* this method with their own method to build 3D content.
*
* @return a Group containing 3D content to display
*/
public Group buildScene( SimpleUniverse u)
{
// Build the scene group containing nothing
Group scene = new Group( );
return scene;
}
//--------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -