YoyoLineApp.java Source code

Java tutorial

Introduction

Here is the source code for YoyoLineApp.java

Source

/*
 * YoyoLineApp.java 1.0 98/11/23
 * 
 * Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved.
 * 
 * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
 * modify and redistribute this software in source and binary code form,
 * provided that i) this copyright notice and license appear on all copies of
 * the software; and ii) Licensee does not utilize the software in a manner
 * which is disparaging to Sun.
 * 
 * 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.
 * 
 * This software is not designed or intended for use in on-line control of
 * aircraft, air traffic, aircraft navigation or aircraft communications; or in
 * the design, construction, operation or maintenance of any nuclear facility.
 * Licensee represents and warrants that it will not use or redistribute the
 * Software for such purposes.
 */

/*
 * Getting Started with the Java 3D API written in Java 3D
 * 
 * YoyoLineApp.java demonstrates using Appearance attributes to display only the
 * lines from a more complex geometry.
 */

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

import javax.media.j3d.Alpha;
import javax.media.j3d.Appearance;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.Geometry;
import javax.media.j3d.PolygonAttributes;
import javax.media.j3d.RotationInterpolator;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.TriangleFanArray;
import javax.vecmath.Point3d;
import javax.vecmath.Point3f;

import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.SimpleUniverse;

public class YoyoLineApp extends Applet {

    /////////////////////////////////////////////////
    //
    // create scene graph branch group
    //
    public class Yoyo extends Shape3D {

        ////////////////////////////////////////////
        //
        // create Shape3D with geometry and appearance
        // the geometry is created in method yoyoGeometry
        // the appearance is created in method yoyoAppearance
        //
        public Yoyo() {

            this.setGeometry(yoyoGeometry());
            this.setAppearance(yoyoAppearance());

        } // end of Yoyo constructor

        ////////////////////////////////////////////
        //
        // create yoyo geometry
        // four triangle fans represent the yoyo
        // strip indicies_______________
        //   0 0N+0 to 1N+0 ( 0 to N )
        //   1 1N+1 to 2N+1
        //   2 2N+2 to 3N+2
        //   3 3N+4 to 4N+3
        //
        private Geometry yoyoGeometry() {

            TriangleFanArray tfa;
            int N = 17;
            int totalN = 4 * (N + 1);
            Point3f coords[] = new Point3f[totalN];
            int stripCounts[] = { N + 1, N + 1, N + 1, N + 1 };
            float r = 0.6f;
            float w = 0.4f;
            int n;
            double a;
            float x, y;

            // set the central points for four triangle fan strips
            coords[0 * (N + 1)] = new Point3f(0.0f, 0.0f, w);
            coords[1 * (N + 1)] = new Point3f(0.0f, 0.0f, 0.0f);
            coords[2 * (N + 1)] = new Point3f(0.0f, 0.0f, 0.0f);
            coords[3 * (N + 1)] = new Point3f(0.0f, 0.0f, -w);

            for (a = 0, n = 0; n < N; a = 2.0 * Math.PI / (N - 1) * ++n) {
                x = (float) (r * Math.cos(a));
                y = (float) (r * Math.sin(a));
                coords[0 * (N + 1) + n + 1] = new Point3f(x, y, w);
                coords[1 * (N + 1) + N - n] = new Point3f(x, y, w);
                coords[2 * (N + 1) + n + 1] = new Point3f(x, y, -w);
                coords[3 * (N + 1) + N - n] = new Point3f(x, y, -w);
            }

            tfa = new TriangleFanArray(totalN, TriangleFanArray.COORDINATES, stripCounts);

            tfa.setCoordinates(0, coords);

            return tfa;

        } // end of method yoyoGeometry in class Yoyo

        ////////////////////////////////////////////
        //
        // create yoyo appearance
        //
        private Appearance yoyoAppearance() {

            Appearance appearance = new Appearance();
            PolygonAttributes polyAttrib = new PolygonAttributes();

            polyAttrib.setPolygonMode(PolygonAttributes.POLYGON_LINE);
            appearance.setPolygonAttributes(polyAttrib);

            return appearance;

        } // end of method yoyoAppearance of class Yoyo

    } // end of class Yoyo

    /////////////////////////////////////////////////
    //
    // create scene graph branch group
    //
    public BranchGroup createSceneGraph() {

        BranchGroup objRoot = new BranchGroup();

        // Create the transform group node and initialize it to the
        // identity. Enable the TRANSFORM_WRITE capability so that
        // our behavior code can modify it at runtime. Add it to the
        // root of the subgraph.
        TransformGroup objSpin = new TransformGroup();
        objSpin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

        objRoot.addChild(objSpin);

        objSpin.addChild(new Yoyo());

        // Create a new Behavior object that will perform the desired
        // operation on the specified transform object and add it into
        // the scene graph.
        Transform3D yAxis = new Transform3D();
        Alpha rotationAlpha = new Alpha(-1, 4000);

        RotationInterpolator rotator = new RotationInterpolator(rotationAlpha, objSpin);
        BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
        rotator.setSchedulingBounds(bounds);
        objSpin.addChild(rotator);

        // Let Java 3D perform optimizations on this scene graph.
        objRoot.compile();

        return objRoot;
    } // end of CreateSceneGraph method of YoyoLineApp

    // Create a simple scene and attach it to the virtual universe

    public YoyoLineApp() {
        setLayout(new BorderLayout());
        Canvas3D canvas3D = new Canvas3D(null);
        add("Center", canvas3D);

        BranchGroup scene = createSceneGraph();

        // SimpleUniverse is a Convenience Utility class
        SimpleUniverse simpleU = new SimpleUniverse(canvas3D);

        // This will move the ViewPlatform back a bit so the
        // objects in the scene can be viewed.
        simpleU.getViewingPlatform().setNominalViewingTransform();

        simpleU.addBranchGraph(scene);
    } // end of YoyoLineApp constructor

    //  The following allows this to be run as an application
    //  as well as an applet

    public static void main(String[] args) {
        Frame frame = new MainFrame(new YoyoLineApp(), 256, 256);
    } // end of main method of YoyoLineApp

} // end of class YoyoLineApp