I haven't read the code bellow, but  from what I understand you are
moving the shape creating a new transform3D each time you want to move
it, instead of multipliying it with the new transformation.
Something like this.


Shape3D miShape = new Shape3D;
//I am going to move it for first time
Transform3D firstTransform3D = new Transform3D();
firstTransform3D.set(whatever);
TransformGroup miGroup = new TransformGroup(firstTransform3D);
miGroup.addChild(miShape);
//now if I want to move it again, I have to get the transform already
done

Transform3D oldTransform = new Transform3D();
Transform3D newTransform = new Transform3D();
newTransform.set(whatever);
miGroup.getTransform(oldTransform );
oldTransform.mul(newTransform); //or the other way, never guess ;-),
check the matrix multiplication order
miGroup.setTransform(oldTransform);//that is the old multiplied by the
new one

Should work, sorry for the pseudocode, my machine is not working
propely, I can even hardly open the mail!!

Boby



-----Original Message-----
From: Ben Logan [mailto:[EMAIL PROTECTED] 
Sent: Thursday, December 11, 2003 1:22 PM
To: [EMAIL PROTECTED]
Subject: [JAVA3D] real problems with a translate behavior


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".

===========================================================================
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