sorry i forgot to attach the files in the previous email :(

Well they are attached with this one. Actually i had sent the previous
email accidently. In TestCube.java, i create the gemoetry and appearence
of my object. RIght now it creates points with size 10.0. IT does not
display the points at z=0.25 and z=0.75 as these have transparency =128 ?
my question is why is this happening? Also, if you try to decrease the
point size to 1.0 (line 70), then things work just fine!!! Why?

Thanks
Aditya


/*
 *       @(#)MouseRotateY.java 1.1 98/07/17 16:00:54
 *
 * Copyright (c) 1996-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.
 */


import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.behaviors.mouse.*;

/**
 * MouseRotateY is a Java3D behavior object that lets users control the 
 * rotation of an object via a mouse.
 * <p>
 * To use this utility, first create a transform group that this 
 * rotate behavior will operate on. Then,
 *<blockquote><pre>
 * 
 *   MouseRotateY behavior = new MouseRotateY();
 *   behavior.setTransformGroup(objTrans);
 *   objTrans.addChild(behavior);
 *   behavior.setSchedulingBounds(bounds);
 *
 *</pre></blockquote>
 * The above code will add the rotate behavior to the transform
 * group. The user can rotate any object attached to the objTrans.
 */

public class MouseRotateY extends MouseBehavior {
  double  y_angle;
  double  y_factor;

  /**
   * Creates a rotate behavior given the transform group.
   * @param transformGroup The transformGroup to operate on.
   */
  public MouseRotateY(TransformGroup transformGroup) {
    super(transformGroup);
  }

  /**
   * Creates a default mouse rotate behavior.
   **/
  public MouseRotateY() {
      super(0);
   }

  /**
   * Creates a rotate behavior.
   * Note that this behavior still needs a transform
   * group to work on (use setTransformGroup(tg)) and
   * the transform group must add this behavior.
   * @param flags interesting flags (wakeup conditions).
   */
  public MouseRotateY(int flags) {
      super(flags);
   }

  public void initialize() {
    super.initialize();
    y_angle = 0;
    y_factor = .03;
    if ((flags & INVERT_INPUT) == INVERT_INPUT) {
       invert = true;
       y_factor *= -1;
    }
  }

  public double getYFactor() {
    return y_factor;
  }
  
  public void setFactor( double factor) {
    y_factor = factor;
    
  }
  

  public void processStimulus (Enumeration criteria) {
      WakeupCriterion wakeup;
      AWTEvent[] event;
      int id;
      int  dx;

      while (criteria.hasMoreElements()) {
         wakeup = (WakeupCriterion) criteria.nextElement();
         if (wakeup instanceof WakeupOnAWTEvent) {
            event = ((WakeupOnAWTEvent)wakeup).getAWTEvent();
            for (int i=0; i<event.length; i++) { 
              processMouseEvent((MouseEvent) event[i]);

              if (((buttonPress)&&((flags & MANUAL_WAKEUP) == 0)) ||
                  ((wakeUp)&&((flags & MANUAL_WAKEUP) != 0))){
                
                id = event[i].getID();
                if ((id == MouseEvent.MOUSE_DRAGGED) && 
                    !((MouseEvent)event[i]).isMetaDown() && 
                    !((MouseEvent)event[i]).isAltDown()){
                  
                  x = ((MouseEvent)event[i]).getX();

                  dx = x - x_last;

                  if (!reset){      
                    y_angle = dx * y_factor;
                    
                    transformY.rotY(y_angle);
                    
                    transformGroup.getTransform(currXform);
                    
                    //Vector3d translation = new Vector3d();
                    //Matrix3f rotation = new Matrix3f();
                    Matrix4d mat = new Matrix4d();
                    
                    // Remember old matrix
                    currXform.get(mat);
                    
                    // Translate to origin
                    currXform.setTranslation(new Vector3d(0.0,0.0,0.0));
                    if (invert) {
                        currXform.mul(currXform, transformX);
                        currXform.mul(currXform, transformY);
                    } else {
                        currXform.mul(transformX, currXform);
                        currXform.mul(transformY, currXform);
                    }
                    
                    // Set old translation back
                    Vector3d translation = new 
                      Vector3d(mat.m03, mat.m13, mat.m23);
                    currXform.setTranslation(translation);
                    
                    // Update xform
                    transformGroup.setTransform(currXform);
                  }
                  else {
                    reset = false;
                  }

                  x_last = x;
               }
               else if (id == MouseEvent.MOUSE_PRESSED) {
                  x_last = ((MouseEvent)event[i]).getX();
               }
              }
            }
         }
      }

      wakeupOn (mouseCriterion);
      
   }
}
/**
 * VolumeFrame.java
 *
 *
 * Created: Tue Jun 15 21:17:02 1999
 *
 * @author Aditya Datta
 * @version
 */


import com.sun.j3d.utils.applet.MainFrame; 
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;


//Status: Create a Volume of Bricks of 32*32*32, 1m*1m*1m (x,y,z);


public class TestCube extends Shape3D{
    final static int VOLUMEDIM =4; //32*32*32
    private Geometry vcGeometry;
    private Appearance vcAppearance;
    //create Shape3D with geometry and appearance
    public TestCube(){
        vcGeometry=createGeometry();
        vcAppearance=createAppearance();
        this.setGeometry(vcGeometry);
        this.setAppearance(vcAppearance);
    }
    
    
    //Creates the Coordinates of the voxels
    //These remain fixed throughtout the execution of the program
    //Current Status: Defines the coordinates only
    
    private Geometry createGeometry(){
        Color4b color[] =  { new Color4b((byte)1,(byte)0,(byte)0,(byte)127), new 
Color4b((byte)1,(byte)0,(byte)0,(byte)128), new 
Color4b((byte)0,(byte)1,(byte)0,(byte)127), new 
Color4b((byte)0,(byte)1,(byte)0,(byte)128) };
        int volumesq = VOLUMEDIM*VOLUMEDIM;
        // These are my data arrays for the indexedgeometry array
        Point3d voxelCoordiate[] = new Point3d[VOLUMEDIM*VOLUMEDIM*VOLUMEDIM];
        Color4b voxelColor[] = new Color4b[VOLUMEDIM*VOLUMEDIM*VOLUMEDIM];
        for(int x=0; x<VOLUMEDIM; x++)
            for(int y=0; y<VOLUMEDIM; y++)
                for(int z=0; z<VOLUMEDIM; z++){
                    voxelCoordiate[volumesq*x+VOLUMEDIM*y+z]= 
                        new 
Point3d((double)x/VOLUMEDIM,(double)y/VOLUMEDIM,(double)z/VOLUMEDIM);           

                    //voxelColor[volumesq*x+VOLUMEDIM*y+z]=
                    //new Color4b((byte)0, (byte)1, (byte)0, 
(byte)1);//(byte)(VOLUMEDIM-z));
                    voxelColor[volumesq*x+VOLUMEDIM*y+z]=color[z];
                }     
        IndexedPointArray myCubePoints = new 
IndexedPointArray(VOLUMEDIM*VOLUMEDIM*VOLUMEDIM,
                                                                 
IndexedPointArray.COORDINATES | IndexedPointArray.COLOR_4,
                                                                
VOLUMEDIM*VOLUMEDIM*VOLUMEDIM );
        myCubePoints.setCoordinates(0, voxelCoordiate);
        myCubePoints.setColors(0, voxelColor);
        //maybeican optomise this loop
        for(int i=0; i<VOLUMEDIM*VOLUMEDIM*VOLUMEDIM;i++){
            myCubePoints.setCoordinateIndex(i,i); 
            myCubePoints.setColorIndex(i,i);
        }
        return myCubePoints;
        
    }   
    private Appearance createAppearance(){
        Appearance myCubeapp = new Appearance();
        //increase the size of each point so that it appears a continious volume
        myCubeapp.setPointAttributes(new PointAttributes(10.0f, false));
        TransparencyAttributes myTrans = new TransparencyAttributes();
        myTrans.setTransparencyMode(myTrans.NICEST);
        myCubeapp.setTransparencyAttributes(myTrans);
        return myCubeapp;
    }
}
/**
 * TestMain.java
 *
 *
 * Created: Tue Jun 15 20:50:36 1999
 *
 * @author Aditya Datta
 * @version
 */


import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
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 com.sun.j3d.utils.behaviors.mouse.*;
import TestCube;
public class TestMain extends Applet {

    SimpleUniverse myUniverse;
    Canvas3D canvas3d;
    BranchGroup myScene;
    public TestMain(){
        //set the layout for awt and add a canvas3d on it to display the object
        setLayout(new BorderLayout());
        canvas3d = new Canvas3D(null);
        add("Center", canvas3d);
        // create a new universe and attact a locale to it. Do this later. 
        // Right now use simple universe
        myUniverse = new SimpleUniverse(canvas3d);
        myUniverse.getViewingPlatform().setNominalViewingTransform();
        myScene = createSceneGraph();
        myScene.compile();
        myUniverse.addBranchGraph(myScene);
    }

    // Method Name: createSceneGraph
    // Input paramaters: None
    // Function: Create the scene graph for this graphics scene
    // Retrun value: Reference to the scene graph generated
    // Objects Created:
    // 1) myFrame: object representing the outer bounds of the volume
    public BranchGroup createSceneGraph() {
        TestCube myCube = new TestCube();
        BranchGroup objRoot = new BranchGroup();
        TransformGroup objTrans = new TransformGroup();
        objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
        objRoot.addChild(objTrans);
        BoundingSphere bounds =
            new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
        
        Transform3D cubeMat = new Transform3D();
        TransformGroup cubeTrans = new TransformGroup(cubeMat);
        cubeMat.set(new Vector3d(0.0, 0.0, 0.0));
        cubeTrans.setTransform(cubeMat);
        cubeTrans.addChild(myCube);
        objTrans.addChild(cubeTrans);

        // Create the rotate behavior node   
        MouseRotateY behavior = new MouseRotateY();
        behavior.setTransformGroup(objTrans);
        objTrans.addChild(behavior);
        behavior.setSchedulingBounds(bounds);
        
        // Create the zoom behavior node
        MouseZoom behavior2 = new MouseZoom();
        behavior2.setTransformGroup(objTrans); 
        objTrans.addChild(behavior2); 
        behavior2.setSchedulingBounds(bounds);
        
        // Create the translate behavior node
        MouseTranslate behavior3 = new MouseTranslate();
        behavior3.setTransformGroup(objTrans);
        objTrans.addChild(behavior3);
        behavior3.setSchedulingBounds(bounds);

        return(objRoot);
    }
    

    //This allows it to run as an application
    public static void main(String[] args){
        Frame frame = new MainFrame(new TestMain(), 256,256);
    }

}

Reply via email to