hi, I am sorry if I miss the point, but I use the following transform3d multiplication to get the compound tranformation:
cpTransform = translate * refptInv * scale * rotation * refPT where * refptInv is the inverse translation of refPT; * refPT is the tuple3f coordinates of center of rotation - take it as a translation transform; * translate, scale, rotation are the transformations to be applied on the object. Alessandro --- Jean-Robert D'Amore <[EMAIL PROTECTED]> escreveu: > Try by inverting the matrix multiplication. > Let say you've got the matric M for the scene, and T > for the transform. > If you do M=M*T then the transform will be in local > coordinatyes. If you > do M=T*M then you have the transform in global > coordinates... > JR > > Ben Logan wrote: > > >Could someone take a quick look at the following > class. The problem is > >that when a rotation is performed and then a > translation the translation > >takes place on the local coordinates. i.e it moves > the shape in the > >direction of the rotation. I want the shape to be > moved in the same > >direction whatever the rotation. Any help would be > much appreciated. > >Thanks > >Ben > > > > > >public class MyPickTranslateBehavior extends > PickTranslateBehavior { > > 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; > > > > 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; > > > > float step = 0.005f; // was 0.01 > > > > 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; > > > > transformGroup = new TransformGroup(); > > modelTrans = new Transform3D(); > > transformY = new Transform3D(); > > > transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); > > > transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_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.BUTTON1_MASK) { > > //System.out.println("LEFT MOUSE PRESSED > _ DOING ROTATION"); > > > > 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); > > > > //System.out.println("DELETE MODE? " > + > >frame.deleteMode()); > > > > if (frame.deleteMode() == true) { // > So delete that shape > > > > try { > > //no capability to detact the > branchgroup > > > transformGroup.removeAllChildren(); // Not yet > working > > > > } > > catch (Exception ex) { > > System.out.println("DELETE > EXCEPTION : " + > >ex.toString()); > > } > > > > } > > > > else { // Setup rotation of that > shape > > > > > transformGroup.getTransform(modelTrans); > > > > x = x_last = eventPress.getX(); > > } > > } > > } > > > > if (eventPress.getID() == > MouseEvent.MOUSE_DRAGGED) { > > // Rotating the object around the Y > axis only > > x = eventPress.getX(); > > > > y_angle = (x - x_last) * x_factor; > > > > transformY.rotY(y_angle); > > > > modelTrans.mul(modelTrans, transformY); > > > > > transformGroup.setTransform(modelTrans); > > > > x_last = x; > > } > > } > > > > > > if (eventPress.getModifiers() == > MouseEvent.BUTTON3_MASK) { > > //System.out.println("RIGHT MOUSE PRESSED > _ DOING > >TRANSLATION"); > > > === message truncated === Yahoo! Mail - 6MB, anti-spam e antivírus gratuito. Crie sua conta agora: http://mail.yahoo.com.br =========================================================================== 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".