⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 example.java

📁 JAVA网络三维技术3D的设计与实现
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 *
 *  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 + -