I got this same example to work on our Octane, but first I had to apply a
patch to the GL lib that was posted here some time ago.
I dont know if this patch still works or wether the problem was fixed by
SGI. I also had to change the interocular  default.


At 04:59 PM 6/5/00 -0500, you wrote:
>Hi,
>    Could someone explain to me what is wrong with the following modified
>GearBox example?  I am trying to get stereo graphics to work.  What I see
>on my SGI Octane are two images.  The left eye image looks O.K.  The right
>eye image is the same color as the background.  Furthermore, the right eye
>sees both images which is incorrect.  The left eye on the other hand sees
>only the left eye image.
>
>/*
>  *      @(#)GearBox.java 1.16 00/02/10 13:13:55
>  *
>  * Copyright (c) 1996-2000 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.
>  */
>
>import com.sun.j3d.utils.behaviors.mouse.*;
>import java.applet.Applet;
>import java.awt.*;
>import java.awt.event.*;
>import com.sun.j3d.utils.applet.MainFrame;
>import com.sun.j3d.utils.universe.*;
>import javax.media.j3d.*;
>import javax.vecmath.*;
>import java.lang.Integer;
>
>public class GearBox extends Applet {
>
>     static final int defaultToothCount = 48;
>
>     public BranchGroup createGearBox(int toothCount) {
>         Transform3D tempTransform = new Transform3D();
>
>         // Create the root of the branch graph
>         BranchGroup branchRoot = createBranchEnvironment();
>
>         // Create a Transformgroup to scale all objects so they
>         // appear in the scene.
>         TransformGroup objScale = new TransformGroup();
>         Transform3D t3d = new Transform3D();
>         t3d.setScale(0.4);
>         objScale.setTransform(t3d);
>         branchRoot.addChild(objScale);
>
>         // Create an Appearance.
>         Appearance look = new Appearance();
>         Color3f objColor = new Color3f(0.5f, 0.5f, 0.6f);
>         Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
>         Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
>         look.setMaterial(new Material(objColor, black,
>                                       objColor, white, 100.0f));
>
>
>         // 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 gearboxTrans = new TransformGroup();
>         gearboxTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
>         gearboxTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
>         objScale.addChild(gearboxTrans);
>
>         // Create a bounds for the mouse behavior methods
>         BoundingSphere bounds =
>             new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
>
>         // Create a new Behavior object that will rotate the object and
>         // add it into the scene graph.
>         MouseRotate mouseBeh1 = new MouseRotate(gearboxTrans);
>         gearboxTrans.addChild(mouseBeh1);
>         mouseBeh1.setSchedulingBounds(bounds);
>
>         MouseZoom mouseBeh2 = new MouseZoom(gearboxTrans);
>         gearboxTrans.addChild(mouseBeh2);
>         mouseBeh2.setSchedulingBounds(bounds);
>
>         MouseTranslate mouseBeh3 = new MouseTranslate(gearboxTrans);
>         gearboxTrans.addChild(mouseBeh3);
>         mouseBeh3.setSchedulingBounds(bounds);
>
>         // Define the shaft base information
>         int shaftCount = 4;
>         int secondsPerRevolution = 8000;
>
>         // Create the Shaft(s)
>         Shaft shafts[] = new Shaft[shaftCount];
>         TransformGroup shaftTGs[] = new TransformGroup[shaftCount];
>         Alpha shaftAlphas[] = new Alpha[shaftCount];
>         RotationInterpolator shaftRotors[]
>             = new RotationInterpolator[shaftCount];
>         Transform3D shaftAxis[] = new Transform3D[shaftCount];
>
>         // Note: the following arrays we're incorporated to make changing
>         // the gearbox easier.
>         float shaftRatios[] = new float[shaftCount];
>         shaftRatios[0] = 1.0f;
>         shaftRatios[1] = 0.5f;
>         shaftRatios[2] = 0.75f;
>         shaftRatios[3] = 5.0f;
>
>         float shaftRadius[] = new float[shaftCount];
>         shaftRadius[0] = 0.2f;
>         shaftRadius[1] = 0.2f;
>         shaftRadius[2] = 0.2f;
>         shaftRadius[3] = 0.2f;
>
>         float shaftLength[] = new float[shaftCount];
>         shaftLength[0] = 1.8f;
>         shaftLength[1] = 0.8f;
>         shaftLength[2] = 0.8f;
>         shaftLength[3] = 0.8f;
>
>         float shaftDirection[] = new float[shaftCount];
>         shaftDirection[0] = 1.0f;
>         shaftDirection[1] = -1.0f;
>         shaftDirection[2] = 1.0f;
>         shaftDirection[3] = -1.0f;
>
>         Vector3d shaftPlacement[] = new Vector3d[shaftCount];
>         shaftPlacement[0] = new Vector3d(-0.75, -0.9, 0.0);
>         shaftPlacement[1] = new Vector3d(0.75, -0.9, 0.0);
>         shaftPlacement[2] = new Vector3d(0.75, 0.35, 0.0);
>         shaftPlacement[3] = new Vector3d(-0.75, 0.60, -0.7);
>
>         // Create the shafts.
>         for(int i = 0; i < shaftCount; i++) {
>             shafts[i] = new Shaft(shaftRadius[i], shaftLength[i], 25, look);
>         }
>
>         // Create a transform group node for placing each shaft
>         for(int i = 0; i < shaftCount; i++) {
>             shaftTGs[i] = new TransformGroup();
>             gearboxTrans.addChild(shaftTGs[i]);
>             shaftTGs[i].getTransform(tempTransform);
>             tempTransform.setTranslation(shaftPlacement[i]);
>             shaftTGs[i].setTransform(tempTransform);
>             shaftTGs[i].addChild(shafts[i]);
>         }
>
>         // Add rotation interpolators to rotate the shaft in the appropriate
>         // direction and at the appropriate rate
>         for(int i = 0; i < shaftCount; i++) {
>             shaftAlphas[i] = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0,
>                                       (long)(secondsPerRevolution
>                                              * shaftRatios[i]),
>                                       0, 0,
>                                       0, 0, 0);
>             shaftAxis[i] = new Transform3D();
>             shaftAxis[i].rotX(Math.PI/2.0);
>             shaftRotors[i]
>                 = new RotationInterpolator(shaftAlphas[i], shafts[i],
>                                            shaftAxis[i],
>                                            0.0f,
>                                            shaftDirection[i] *
>                                            (float) Math.PI * 2.0f);
>             shaftRotors[i].setSchedulingBounds(bounds);
>             shaftTGs[i].addChild(shaftRotors[i]);
>         }
>
>         // Define the gear base information.  Again, these arrays exist to
>         // make the process of changing the GearBox via an editor faster
>         int gearCount = 5;
>         float valleyToCircularPitchRatio = .15f;
>         float pitchCircleRadius = 1.0f;
>         float addendum = 0.05f;
>         float dedendum = 0.05f;
>         float gearThickness = 0.3f;
>         float toothTipThickness = 0.27f;
>
>         // Create an array of gears and their associated information
>         SpurGear gears[] = new SpurGear[gearCount];
>         TransformGroup gearTGs[] = new TransformGroup[gearCount];
>
>         int gearShaft[] = new int[gearCount];
>         gearShaft[0] = 0;
>         gearShaft[1] = 1;
>         gearShaft[2] = 2;
>         gearShaft[3] = 0;
>         gearShaft[4] = 3;
>
>         float ratio[] = new float[gearCount];
>         ratio[0] = 1.0f;
>         ratio[1] = 0.5f;
>         ratio[2] = 0.75f;
>         ratio[3] = 0.25f;
>         ratio[4] = 1.25f;
>
>         Vector3d placement[] = new Vector3d[gearCount];
>         placement[0] = new Vector3d(0.0, 0.0, 0.0);
>         placement[1] = new Vector3d(0.0, 0.0, 0.0);
>         placement[2] = new Vector3d(0.0, 0.0, 0.0);
>         placement[3] = new Vector3d(0.0, 0.0, -0.7);
>         placement[4] = new Vector3d(0.0, 0.0, 0.0);
>
>         // Create the gears.
>         for(int i = 0; i < gearCount; i++) {
>             gears[i]
>                 = new SpurGearThinBody(((int)((float)toothCount * ratio[i])),
>                                        pitchCircleRadius * ratio[i],
>                                        shaftRadius[0],
>                                        addendum, dedendum,
>                                        gearThickness,
>                                        toothTipThickness,
>                                        valleyToCircularPitchRatio, look);
>         }
>
>         // Create a transform group node for arranging the gears on a shaft
>         // and attach the gear to its associated shaft
>         for(int i = 0; i < gearCount; i++) {
>             gearTGs[i] = new TransformGroup();
>             gearTGs[i].getTransform(tempTransform);
>             tempTransform.rotZ((shaftDirection[gearShaft[i]] == -1.0) ?
>                                gears[i].getCircularPitchAngle()/-2.0f :
>                                0.0f);
>             tempTransform.setTranslation(placement[i]);
>             gearTGs[i].setTransform(tempTransform);
>             gearTGs[i].addChild(gears[i]);
>             shafts[gearShaft[i]].addChild(gearTGs[i]);
>         }
>
>         // Have Java 3D perform optimizations on this scene graph.
>         branchRoot.compile();
>
>         return branchRoot;
>     }
>
>     BranchGroup createBranchEnvironment(){
>         // Create the root of the branch graph
>         BranchGroup branchRoot = new BranchGroup();
>
>         // Create a bounds for the background and lights
>         BoundingSphere bounds =
>             new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
>
>         // Set up the background
>         Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
>         Background bgNode = new Background(bgColor);
>         bgNode.setApplicationBounds(bounds);
>         branchRoot.addChild(bgNode);
>
>         // Set up the ambient light
>         Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
>         AmbientLight ambientLightNode = new AmbientLight(ambientColor);
>         ambientLightNode.setInfluencingBounds(bounds);
>         branchRoot.addChild(ambientLightNode);
>
>         // Set up the directional lights
>         Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
>         Vector3f light1Direction  = new Vector3f(4.0f, -7.0f, -12.0f);
>         Color3f light2Color = new Color3f(0.3f, 0.3f, 0.4f);
>         Vector3f light2Direction  = new Vector3f(-6.0f, -2.0f, -1.0f);
>
>         DirectionalLight light1
>             = new DirectionalLight(light1Color, light1Direction);
>         light1.setInfluencingBounds(bounds);
>         branchRoot.addChild(light1);
>
>         DirectionalLight light2
>             = new DirectionalLight(light2Color, light2Direction);
>         light2.setInfluencingBounds(bounds);
>         branchRoot.addChild(light2);
>
>         return branchRoot;
>     }
>
>     public GearBox() {
>         this(defaultToothCount);
>     }
>
>     public GearBox(int toothCount) {
>         setLayout(new BorderLayout());
>//      GraphicsConfiguration config =
>//         SimpleUniverse.getPreferredConfiguration();
>
>         GraphicsConfigTemplate3D template = new GraphicsConfigTemplate3D() ;
>         template.setStereo(REQUIRED) ;
>
>         GraphicsConfiguration config ;
>         config =
>
>GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().
>getBestConfiguration(template) ;
>         Canvas3D c = new Canvas3D(config);
>         c.setStereoEnable(true) ;
>         System.out.println(c.getStereoAvailable()) ;
>         add("Center", c);
>
>         // Create the gearbox and attach it to the virtual universe
>         BranchGroup scene = createGearBox(toothCount);
>         SimpleUniverse u = new SimpleUniverse(c);
>
>         // This will move the ViewPlatform back a bit so the
>         // objects in the scene can be viewed.
>         u.getViewingPlatform().setNominalViewingTransform();
>
>         u.addBranchGraph(scene);
>     }
>
>     //
>     // The following allows GearBox to be run as an application
>     // as well as an applet
>     //
>     public static void main(String[] args) {
>         int value;
>
>         if (args.length > 1) {
>             System.out.println("Usage: java GearBox  #teeth (LCD 4)");
>             System.exit(0);
>         } else if (args.length == 0) {
>             new MainFrame(new GearBox(), 700, 700);
>         } else
>             {
>                 try{
>                     value = Integer.parseInt(args[0]);
>                 } catch (NumberFormatException e) {
>                     System.out.println("Illegal integer specified");
>                     System.out.println("Usage: java GearBox  #teeth (LCD
> 4)");
>                     value = 0;
>                     System.exit(0);
>                 }
>                 if (value <= 0 | (value % 4) != 0) {
>                     System.out.println("Integer not a positive multiple
> of 4");
>                     System.out.println("Usage: java GearBox  #teeth (LCD
> 4)");
>                     System.exit(0);
>                 }
>                 new MainFrame(new GearBox(value), 700, 700);
>             }
>     }
>}
>
>Thanks,
>Ed Plaskacz
>[EMAIL PROTECTED]
>
>===========================================================================
>To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
>of the message "signoff JAVA3D-INTEREST".  For general help, send email to
>[EMAIL PROTECTED] and include in the body of the message "help".

Jack S. Gundrum
Visualization Group
Center for Academic Computing
Penn State University
Email:[EMAIL PROTECTED]
Phone:(814)865-1863

===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA3D-INTEREST".  For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".

Reply via email to