import java.util.*; import javax.media.j3d.*; import javax.vecmath.*; import java.awt.*; import java.awt.event.*;
import com.sun.j3d.utils.geometry.*; import com.sun.j3d.utils.picking.*; import com.sun.j3d.utils.picking.behaviors.*; Can someone please help with this? I have a translate behavior that successfully moves a shape through a scene while the user drags the mouse with the right mouse button, it works fine until you try and do it a second time, at which point the shape returns to its original position and translates from there. I am calling setTransform where I think I should be, I'm totally stuck, would really appreciate any help. Here is some sample output from the program: mouse pressed : MODEL TRANS: 1.0, 0.0, 0.0, 2.5 0.0, 1.0, 0.0, 0.0 0.0, 0.0, 1.0, 2.5 0.0, 0.0, 0.0, 1.0 mouse dragged : MODEL TRANS: 1.0, 0.0, 0.0, 2.5 0.0, 1.0, 0.0, 0.0 0.0, 0.0, 1.0, 2.5 0.0, 0.0, 0.0, 1.0 CALLING UPDATE SCENE CURRENT SHAPE TRANSFORM: 1.0, 0.0, 0.0, 2.5 0.0, 1.0, 0.0, 0.0 0.0, 0.0, 1.0, 2.5 0.0, 0.0, 0.0, 1.0 CURRENT SHAPE TRANSFORM: 1.0, 0.0, 0.0, 2.508 0.0, 1.0, 0.0, 0.0 0.0, 0.0, 1.0, 2.5 0.0, 0.0, 0.0, 1.0 CURRENT SHAPE TRANSFORM: 1.0, 0.0, 0.0, 2.516 0.0, 1.0, 0.0, 0.0 0.0, 0.0, 1.0, 2.5 0.0, 0.0, 0.0, 1.0 CURRENT SHAPE TRANSFORM: 1.0, 0.0, 0.0, 2.524 0.0, 1.0, 0.0, 0.0 0.0, 0.0, 1.0, 2.5 0.0, 0.0, 0.0, 1.0 mouse dragged : MODEL TRANS: 1.0, 0.0, 0.0, 2.532 0.0, 1.0, 0.0, 0.0 0.0, 0.0, 1.0, 2.5 0.0, 0.0, 0.0, 1.0 CALLING UPDATE SCENE CURRENT SHAPE TRANSFORM: 1.0, 0.0, 0.0, 2.532 0.0, 1.0, 0.0, 0.0 0.0, 0.0, 1.0, 2.5 0.0, 0.0, 0.0, 1.0 Etc etc etc :) Then, the second time you try and do it: mouse pressed : MODEL TRANS: 1.0, 0.0, 0.0, 2.5 0.0, 1.0, 0.0, 0.0 0.0, 0.0, 1.0, 2.5 0.0, 0.0, 0.0, 1.0 mouse dragged : MODEL TRANS: 1.0, 0.0, 0.0, 2.5 0.0, 1.0, 0.0, 0.0 0.0, 0.0, 1.0, 2.5 0.0, 0.0, 0.0, 1.0 CALLING UPDATE SCENE CURRENT SHAPE TRANSFORM: 1.0, 0.0, 0.0, 2.5 0.0, 1.0, 0.0, 0.0 0.0, 0.0, 1.0, 2.5 0.0, 0.0, 0.0, 1.0 CURRENT SHAPE TRANSFORM: 1.0, 0.0, 0.0, 2.508 0.0, 1.0, 0.0, 0.0 0.0, 0.0, 1.0, 2.5 0.0, 0.0, 0.0, 1.0 It starts again from the shapes original starting position. I would really appreciate some help, thanks in advance, Ben public class MyPickTranslateBehavior extends PickTranslateBehavior implements Constants { protected WakeupCondition m_WakeupCondition = null; private int x = 0; private int y = 0; private int x_last = 0; private int y_last = 0; private double y_angle = 0.0; private double x_factor = 0.02; int changeX; int changeY; Appearance appear; ColoringAttributes ca; private Transform3D modelTrans = null; private Transform3D transformY = null; private PickResult pickResult = null; private Node pickNode = null; private TransformGroup transformGroup = null; Canvas3D canvas; BranchGroup objRoot; Java3DFrame frame; BranchGroup guideShape; double step = 0.008; public MyPickTranslateBehavior(Java3DFrame f, BranchGroup objRoot, Canvas3D canvas, BoundingSphere bounds) { super(objRoot, canvas, bounds); this.frame = f; this.setBounds(bounds); this.canvas = canvas; this.objRoot = objRoot; modelTrans = new Transform3D(); transformY = new Transform3D(); transformGroup = new TransformGroup(); transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); transformGroup.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE); //create the wakeupCriterion for the behavior WakeupCriterion criterionArray[] = new WakeupCriterion[2]; criterionArray[0] = new WakeupOnAWTEvent(MouseEvent.MOUSE_PRESSED); criterionArray[1] = new WakeupOnAWTEvent(MouseEvent.MOUSE_DRAGGED); //save the WakeupCriterion for the behavior m_WakeupCondition = new WakeupOr(criterionArray); } public void initialize() { // initialize wakeupOn(m_WakeupCondition); //Apply the initial WakeupCriterion } public void processStimulus(Enumeration criteria) { // processStimulus while (criteria.hasMoreElements()) { WakeupCriterion wakeUp = (WakeupCriterion) criteria.nextElement(); if (wakeUp instanceof WakeupOnAWTEvent) { AWTEvent[] evt = ( (WakeupOnAWTEvent) wakeUp).getAWTEvent(); try { processAWTEvent(evt); } catch (Exception e) { } } } //Assign the next WakeupCondition, so we are notified again wakeupOn(m_WakeupCondition); } private void processAWTEvent(AWTEvent[] events) { for (int n = 0; n < events.length; n++) { if (events[n] instanceof MouseEvent) { MouseEvent eventPress = (MouseEvent) events[n]; if (eventPress.getModifiers() == MouseEvent.BUTTON3_MASK) { //System.out.println("RIGHT MOUSE PRESSED _ DOING TRANSLATION"); if (eventPress.getID() == MouseEvent.MOUSE_PRESSED) { pickCanvas.setShapeLocation(eventPress); pickResult = pickCanvas.pickClosest(); if (pickResult != null) { pickNode = pickResult.getObject(); transformGroup = (TransformGroup) pickResult.getNode( PickResult. TRANSFORM_GROUP); transformGroup.getTransform(modelTrans); System.out.println("mouse pressed : MODEL TRANS: " + modelTrans.toString()); x = x_last = eventPress.getX(); y = y_last = eventPress.getY(); } } if ( (eventPress.getID() == MouseEvent.MOUSE_DRAGGED)) { System.out.println("mouse dragged : MODEL TRANS: " + modelTrans.toString()); transformGroup.setTransform(modelTrans); //transformGroup.getTransform(modelTrans); //System.out.println("mouse dragged 2 : MODEL TRANS: " + modelTrans.toString()); // Translating the object on both the X and Y axis x = eventPress.getX(); y = eventPress.getY(); changeX = x - x_last; changeY = y - y_last; updateScene(); x_last = x; y_last = y; } } } } } public void updateScene() { System.out.println("CALLING UPDATE SCENE"); int loopCount = changeX; if (changeX < 0) { loopCount = changeX * -1; //make pos } loopCount = loopCount * 4; boolean rightCollision = false; boolean leftCollision = false; int stepCountRight = 0; int stepCountLeft = 0; for (int i = 0; i < loopCount; i++) { //transformGroup.getTransform(modelTrans); System.out.println("CURRENT SHAPE TRANSFORM: " + modelTrans.toString()); Vector3d temp = new Vector3d(); modelTrans.get(temp); Vector3d temp2 = new Vector3d(); if (frame.inCollision() && (leftCollision == false) && (rightCollision == false)) { if (changeX < 0) { temp2 = new Vector3d(step, 0.0, 0.0); leftCollision = true; } else { temp2 = new Vector3d( -step, 0.0, 0.0); rightCollision = true; } } else { if (changeX > 0) { if ( (rightCollision == true) && (stepCountRight == 0)) { temp2 = new Vector3d( -step, 0.0, 0.0); stepCountRight--; } else { temp2 = new Vector3d(step, 0.0, 0.0); } if (rightCollision && (stepCountRight != 0)) { stepCountRight++; } } else { if ( (leftCollision == true) && (stepCountLeft == 0)) { temp2 = new Vector3d(step, 0.0, 0.0); stepCountLeft--; } else { temp2 = new Vector3d( -step, 0.0, 0.0); } if (leftCollision && (stepCountLeft != 0)) { stepCountLeft++; } } } Transform3D t2 = new Transform3D(); t2.setTranslation(temp2); modelTrans.mul(modelTrans, t2); transformGroup.setTransform(modelTrans); } } } ******************************************** Ben Logan - Graduate Software Engineer RCID Stephenson Building Newcastle Upon Tyne NE1 7RU www.rcid.ncl.ac.uk ******************************************** =========================================================================== 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".