What you do is correct (as far as I know) cos you do something like M'=P-1*M*P where P is the passage matrix from the global base to the translated base. Hence you express the correct matrix in the global base...
Another way of doing it is to reinit the matrix to ID, but having previously stored the translation information int a vector. Then you can apply rotation and scale, and afterthat reset the translation component with your vector. That what's done in the OrbitBehavior class

Alessandro Borges wrote:
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".


  

--
D'Amore Jean-Robert
IT Systems
Bell Geospace Ltd.
Unit 5A, Crombie Lodge
Aberdeen A.S.T.P
Balgownie Drive
Aberdeen AB228GU

Tel: +44(0)1224227703
Email: [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".

Reply via email to