2013-12-08 39 views
1

欲旋转对象轮定制枢轴,这是它的点,所以我有这样的代码:如何在JavaFX中围绕自定义透视旋转对象?

private final EventHandler<MouseEvent> mouseEventHandler = new EventHandler<MouseEvent>() { 
     @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); // - 

       } 
      } 
     } 
    }; 

camForm1camForm2和是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)。我究竟做错了什么?

回答

6

自己刚刚处理了这个问题。

我不太了解您的代码,但Rotate class允许设置自定义轴心点。

一个例子:

Box box = new Box(1, 1, 1); // can be any Node 
box.getTransforms().add(new Rotate(angle, pivotX, pivotY, pivotZ, Rotate.Z_AXIS)); 
+0

我试图从(0,0,0),这是在构造函数中设置一些新的与setPivotX(pivot.getX())的'帮助'等改变支点在Y和Z轴上。你建议添加新的变换,但这并不意味着每次我改变主轴时,都会添加新的变换。而变换的数组可能非常庞大。 – Eugene

+0

如果您需要旋转更改,请使用getTransforms()。get(rotationIndex)访问它。毕竟,getTransforms()确实返回一个列表,并且JavaFX转换是可变的。 –

0

创建旋转对象

Rotate x = new Rotate(1,2,7,134); 

力与旋转属性定制枢轴位置

x.pivotXProperty().set(2); 
x.pivotYProperty().set(7); 
x.pivotZProperty().set(134); 

添加旋转轴

x.axisProperty().setValue(Rotate.Y_AXIS); 

使用GET转换

meshViews[14].getTransforms().add(x); 
meshViews[9].getTransforms().add(x);