我想围绕一个自定义枢轴旋转一个对象,这是它的重点,所以我有这样的代码:
private final EventHandlermouseEventHandler = new EventHandler () { @Override public void handle(MouseEvent mouseEvent) { if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) { dragStartX = mouseEvent.getSceneX(); dragStartY = mouseEvent.getSceneY(); mousePosX = mouseEvent.getSceneX(); mousePosY = mouseEvent.getSceneY(); mouseOldX = mouseEvent.getSceneX(); mouseOldY = mouseEvent.getSceneY(); if (mouseEvent.isMiddleButtonDown()) { pivot = mouseEvent.getPickResult().getIntersectedPoint(); camForm1.rx.setPivotX(pivot.getX()); camForm1.ry.setPivotY(pivot.getY()); camForm1.rz.setPivotZ(pivot.getZ()); System.out.println(pivot); } } else if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED) { double modifier = 1.0; double modifierFactor = 0.3; if (mouseEvent.isControlDown()) { modifier = 0.1; } if (mouseEvent.isShiftDown()) { modifier = 10.0; } mouseOldX = mousePosX; mouseOldY = mousePosY; mousePosX = mouseEvent.getSceneX(); mousePosY = mouseEvent.getSceneY(); mouseDeltaX = (mousePosX - mouseOldX); //*DELTA_MULTIPLIER; mouseDeltaY = (mousePosY - mouseOldY); //*DELTA_MULTIPLIER; double flip = -1.0; if (mouseEvent.isPrimaryButtonDown() && mouseEvent.isSecondaryButtonDown()) { camForm2.t.setX(camForm2.t.getX() + flip * mouseDeltaX * modifierFactor * modifier * 0.3); // - camForm2.t.setY(camForm2.t.getY() + mouseDeltaY * modifierFactor * modifier * 0.3); // - yFlip* } else if (mouseEvent.isSecondaryButtonDown()) { camForm1.ry.setAngle(camForm1.ry.getAngle() - mouseDeltaX * modifierFactor * modifier * 2.0); // + yFlip* camForm1.rx.setAngle(camForm1.rx.getAngle() + flip * mouseDeltaY * modifierFactor * modifier * 2.0); // - } } } };
camForm1
并且camForm2
是XForm
类的例子.
public class XForm extends Group { public enum RotateOrder { XYZ, XZY, YXZ, YZX, ZXY, ZYX } public Translate t = new Translate(); public Translate p = new Translate(); public Translate ip = new Translate(); public Rotate rx = new Rotate(0.0, 0.0, 0.0, 0.0, Rotate.X_AXIS); public Rotate ry = new Rotate(0.0, 0.0, 0.0, 0.0, Rotate.Y_AXIS); public Rotate rz = new Rotate(0.0, 0.0, 0.0, 0.0, Rotate.Z_AXIS); public Scale s = new Scale(); public XForm() { super(); getTransforms().addAll(t, rz, ry, rx, s); } ... }
但是旋转是在点O(0,0,0)附近.我究竟做错了什么?