Hi Florin:
Thank you for your reply!
For the first problem, your code worked perfectly, everything seems all right now.
For the second one, I tried to modify my code under your suggestion, it worked too. I
can move the control points and the curve changed correspondingly. But, it still has
some problems.
1. Sometimes the points can't be picked.I mean some can be picked, some others can not.
2. After I rotated the scene, sometimes I found the point I picked moved to the
opposite direction of my mouse movement.
I'm not sure the reasons for these problems. I post my whole codes below, I will
appreciate if you or someone else can read it and give me some advice.
The following codes is the behavior class, I think the preblems must exist in it. If
you want to see my current result, I will be glad to post the remaining part of my
program.
Thanks a lot.
NEAL
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.picking.*;
public class UpdateBehavior1 extends Behavior {
WakeupCriterion[] mouseEvents;
WakeupOr mouseCriterion;
int x, y, last_x, last_y;
double x_factor = .006;
double y_factor = .006;
Canvas3D canvas3D;
BranchGroup branchGroup;
TransformGroup pointsTG;
BezierCurve3D curve;
BezierControlPoint[] points;
TransformGroup[] pTG;
PickCanvas pickCanvas;
TransformGroup tg;
Point3d mousePos;
UpdateBehavior1(Canvas3D canvas3D, BranchGroup branchGroup, TransformGroup pointsTG,
BezierCurve3D curve, BezierControlPoint[] points, TransformGroup[] pTG) {
this.canvas3D = canvas3D;
this.branchGroup = branchGroup;
this.pointsTG = pointsTG;
this.curve = curve;
this.points = points;
this.pTG = pTG;
pickCanvas = new PickCanvas(canvas3D, branchGroup);
pickCanvas.setTolerance(8.0f);
tg = new TransformGroup();
mousePos = new Point3d();
}
public void initialize() {
x = 0; y = 0;
last_x = 0; last_y = 0;
mouseEvents = new WakeupCriterion[2];
mouseEvents[0] = new WakeupOnAWTEvent(MouseEvent.MOUSE_DRAGGED);
mouseEvents[1] = new WakeupOnAWTEvent(MouseEvent.MOUSE_PRESSED);
mouseCriterion = new WakeupOr(mouseEvents);
wakeupOn (mouseCriterion);
}
public void processStimulus (Enumeration criteria) {
WakeupCriterion wakeup;
AWTEvent[] event;
int id;
int dx, dy;
while (criteria.hasMoreElements()) {
wakeup = (WakeupCriterion) criteria.nextElement();
if (wakeup instanceof WakeupOnAWTEvent) {
event = ((WakeupOnAWTEvent)wakeup).getAWTEvent();
for (int i=0; i<event.length; i++) {
id = event[i].getID();
if (id == MouseEvent.MOUSE_PRESSED
&& !((MouseEvent)event[i]).isAltDown()
&& ((MouseEvent)event[i]).isMetaDown()) {
x = ((MouseEvent)event[i]).getX();
y = ((MouseEvent)event[i]).getY();
pickCanvas.setShapeLocation(x, y);
PickResult pr = pickCanvas.pickClosest();
if ((pr != null) &&
((tg = (TransformGroup)pr.getNode(PickResult.TRANSFORM_GROUP)) != null)
&& (tg.getCapability(TransformGroup.ALLOW_TRANSFORM_READ))
&& (tg.getCapability(TransformGroup.ALLOW_TRANSFORM_WRITE))){
last_x = x; last_y = y;
}
}
if (id == MouseEvent.MOUSE_DRAGGED
&& !((MouseEvent)event[i]).isAltDown()
&& ((MouseEvent)event[i]).isMetaDown()) {
x = ((MouseEvent)event[i]).getX();
y = ((MouseEvent)event[i]).getY();
dx = x - last_x;
dy = y - last_y;
if (((Math.abs(dy) < 100) && (Math.abs(dx) < 100))) {
Point3d mousePos = new Point3d();
canvas3D.getPixelLocationInImagePlate(x, y, mousePos);
Vector3d moveVec = new Vector3d();
moveVec.x = dx * x_factor;
moveVec.y = -dy * y_factor;
pickCanvas.setShapeLocation(x, y);
PickResult pr = pickCanvas.pickClosest();
if ((pr != null) &&
((tg = (TransformGroup)pr.getNode(PickResult.TRANSFORM_GROUP)) != null)
&& (tg.getCapability(TransformGroup.ALLOW_TRANSFORM_READ))
&& (tg.getCapability(TransformGroup.ALLOW_TRANSFORM_WRITE))){
Transform3D t3d = new Transform3D();
tg.getTransform(t3d);
Transform3D current = new Transform3D();
current.setTranslation(moveVec);
current.mul(t3d, current);
tg.setTransform(current);
for (int j=0; j<4; j++) points[j].updatePosition(pTG[j]);
curve.updateGeometry(points);
last_x = x; last_y = y;
}
}
}
}
}
}
wakeupOn (mouseCriterion);
}
}
===========================================================================
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".