The easiest way would be to use two transformations. The first one
performs only the translation and the second one, which is a child of the
first, the rotation.

On Tue, 9 Dec 2003 13:34:48 -0000, Ben Logan <[EMAIL PROTECTED]>
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");

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

              x = x_last = eventPress.getX();
              y = y_last = eventPress.getY();
            }
          }

if ( (eventPress.getID() == MouseEvent.MOUSE_DRAGGED)) {

            // Translating the object on both the X and Y axis
            x = eventPress.getX();
            y = eventPress.getY();

            changeX = x - x_last;
            changeY = y - y_last;

            /*
            transformY.set(new Vector3f( ( (float) factor * (float)
changeX),
                                        0f,
                                        (float) factor * (float)
changeY));
            modelTrans.mul(modelTrans, transformY);
            transformGroup.setTransform(modelTrans);
             */
            updateScene();

            x_last = x;
            y_last = y;
          }
        }
      }
    }

}

public void updateScene() {

int loopCount = changeX;

    if (changeX < 0) {
      loopCount = changeX * -1; //make pos
    }

loopCount = loopCount * 2;

    boolean rightCollision = false;
    boolean leftCollision = false;

    int stepCountRight = 0;
    int stepCountLeft = 0;

for (int i = 0; i < loopCount; i++) {

      if (frame.inCollision() && (leftCollision == false) &&
(rightCollision == false)) {
        if (changeX < 0) {
          transformY.set(new Vector3f(step, 0f, 0f));

          leftCollision = true;
        }
        else {
          transformY.set(new Vector3f(-step, 0f, 0f));

          rightCollision = true;
        }
      }

else {

        if (changeX > 0) {
          if ((rightCollision == true) && (stepCountRight == 0)) {
            transformY.set(new Vector3f(-step, 0f, 0f));

            stepCountRight--;
          }

          else {
            transformY.set(new Vector3f(step, 0f, 0f));
          }
          if(rightCollision && (stepCountRight != 0)){
            stepCountRight++;
          }
        }

        else {
          if ((leftCollision ==  true) && (stepCountLeft == 0)) {
            transformY.set(new Vector3f(step, 0f, 0f));
            stepCountLeft--;
          }
          else {
            transformY.set(new Vector3f(-step, 0f, 0f));
          }
          if(leftCollision && (stepCountLeft != 0)){
            stepCountLeft++;
          }
        }

}

      modelTrans.mul(modelTrans, transformY);
      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".



-- http://java3d.virtualworlds.de http://www.3dchat.org - Welcome to the unreal world!

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