Hello,

I looked over your code and it looks like the problem is the getNode()
function is always returning the same thing.  I've never used this
function so I can't really say much more than that about it.

I must say, however, that if you want to move your camera each time from
its current position, you should probably not be setting the initial
camera position by picking. I'm no expert, but here is what I suggest
you do.

First, get the current location of your camera.  Next, determine the
local coordinate movement wrt the camera that you want to perform.
After this, use the convertLocalToVWorld() function to convert the local
camera movement into a global coordinate movement.  Finally, add the
global coordinate movement to the current camera location and you are
done.

Hope this helps.

best,
Brian McCormick

-----Original Message-----
From: Discussion list for Java 3D API
[mailto:[EMAIL PROTECTED] On Behalf Of Ben Logan
Sent: Thursday, December 11, 2003 6:22 AM
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