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);
}
}