2016-08-23 52 views
0

我的应用程序使用交互式网格库读取obj文件并将其保存在meshview中。我想要的是围绕其中心旋转对象。在Javafx中围绕中心旋转对象

现在我的代码显示对象,但是当我旋转它时,它会绕着某个点旋转,导致对象超出窗口。我宁愿旋转围绕其中心的物体。我知道我必须将对象翻译成原点,然后旋转然后再翻译,但我不知道该怎么做。

这是我的代码:

public class JavaFx3DObj extends Application 
{ 
    private static final String Filename = "model/bunny.obj"; 
    private static final double MODEL_SCALE_FACTOR = 10; 
    private static final double MODEL_X_OFFSET = 0; // standard 
    private static final double MODEL_Y_OFFSET = 0; // standard 
    private static final int VIEWPORT_SIZE = 800; 

    private double mouseOldX, mouseOldY = 0; 
    private Rotate rotateX = new Rotate(0, Rotate.X_AXIS); 
    private Rotate rotateY = new Rotate(0, Rotate.Y_AXIS); 
    private Rotate rotateZ = new Rotate(0, Rotate.Z_AXIS); 

    private Group root; 
    private Group buildScene() 
    { 
     File file = new File(Filename); 
     ObjModelImporter importer = new ObjModelImporter(); 
     importer.read(file); 
     MeshView[] meshViews = importer.getImport(); 
     importer.close(); 

     // To make the object appear in the middle of the scene 
     for (MeshView meshView : meshViews) 
     { 
      meshView.setTranslateX(VIEWPORT_SIZE/2 + MODEL_X_OFFSET); 
      meshView.setTranslateY(VIEWPORT_SIZE/2 + MODEL_Y_OFFSET); 
      meshView.setTranslateZ(VIEWPORT_SIZE/2); 
      meshView.setScaleX(MODEL_SCALE_FACTOR); 
      meshView.setScaleY(MODEL_SCALE_FACTOR); 
      meshView.setScaleZ(MODEL_SCALE_FACTOR); 
     } 
     root = new Group(meshViews); 

     return root; 
    } 

    @Override 
    public void start(Stage stage) throws Exception 
    { 
     Group root = buildScene(); 

     PerspectiveCamera camera = new PerspectiveCamera(false); 
     camera.setTranslateX(100); 
     camera.setTranslateY(0); 
     camera.setTranslateZ(100); 
     camera.getTransforms().addAll (rotateX, rotateY, new Translate(0, 0, 400)); 

     root.setRotationAxis(Rotate.Y_AXIS); 
     root.setRotate(200); 

     Scene scene = new Scene(root, 900, 500, true); 
     scene.setFill(Color.rgb(10, 10, 40)); 
     scene.setCamera(camera); 


     scene.setOnMousePressed(event -> 
     { 
      mouseOldX = event.getSceneX(); 
      mouseOldY = event.getSceneY(); 
     }); 

     scene.setOnMouseDragged(event -> 
     { 
      rotateX.setAngle(rotateX.getAngle() - (event.getSceneY() - mouseOldY)); 
      rotateY.setAngle(rotateY.getAngle() + (event.getSceneX() - mouseOldX)); 
      mouseOldX = event.getSceneX(); 
      mouseOldY = event.getSceneY(); 

     }); 
     stage.setTitle("JavaFx3DObj"); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public static void main(String[] args) 
    { 
     launch(args); 
    } 

} 
+0

请提供一个[最小,完整,可验证的示例](http://stackoverflow.com/help/mcve) –

+0

您可以在旋转对象上设置枢轴坐标,使您可以定义yoo想要旋转的点。您应该将对象中心设置为一个枢纽。 – Jhonny007

+0

@ Jhonny007你会写一个简单的代码吗? –

回答

0

你需要做的是设置在旋转枢轴应用之前什么。 所以,你的代码看起来像这样:

public class JavaFx3DObj extends Application { 
    private static final String Filename = "model/bunny.obj"; 
    private static final double MODEL_SCALE_FACTOR = 10; 
    private static final double MODEL_X_OFFSET = 0; // standard 
    private static final double MODEL_Y_OFFSET = 0; // standard 
    private static final int VIEWPORT_SIZE = 800; 

    private double mouseOldX, mouseOldY = 0; 
    private Rotate rotateX = new Rotate(0, Rotate.X_AXIS); 
    private Rotate rotateY = new Rotate(0, Rotate.Y_AXIS); 
    private Rotate rotateZ = new Rotate(0, Rotate.Z_AXIS); 

    private Group root; 
    private Group buildScene() { 
     File file = new File(Filename); 
     ObjModelImporter importer = new ObjModelImporter(); 
     importer.read(file); 
     MeshView[] meshViews = importer.getImport(); 
     importer.close(); 

     // To make the object appear in the middle of the scene 
     for (MeshView meshView : meshViews) { 
      meshView.setTranslateX(VIEWPORT_SIZE/2 + MODEL_X_OFFSET); 
      meshView.setTranslateY(VIEWPORT_SIZE/2 + MODEL_Y_OFFSET); 
      meshView.setTranslateZ(VIEWPORT_SIZE/2); 
      meshView.setScaleX(MODEL_SCALE_FACTOR); 
      meshView.setScaleY(MODEL_SCALE_FACTOR); 
      meshView.setScaleZ(MODEL_SCALE_FACTOR); 
     } 
     root = new Group(meshViews); 

     return root; 
    } 

    @Override 
    public void start(Stage stage) throws Exception { 
     Group root = buildScene(); 

     PerspectiveCamera camera = new PerspectiveCamera(false); 
     camera.setTranslateX(100); 
     camera.setTranslateY(0); 
     camera.setTranslateZ(100); 
     camera.getTransforms().addAll (rotateX, rotateY, new Translate(0, 0, 400)); 

     root.setRotationAxis(Rotate.Y_AXIS); 
     root.setRotate(200); 

     Scene scene = new Scene(root, 900, 500, true); 
     scene.setFill(Color.rgb(10, 10, 40)); 
     scene.setCamera(camera); 

     //################ Set pivot points ################\\ 
     rotateX.setPivotX(VIEWPORT_SIZE/2 + MODEL_X_OFFSET); 
     rotateX.setPivotY(VIEWPORT_SIZE/2 + MODEL_Y_OFFSET); 
     rotateX.setPivotZ(VIEWPORT_SIZE/2); 

     rotateY.setPivotX(VIEWPORT_SIZE/2 + MODEL_X_OFFSET); 
     rotateY.setPivotY(VIEWPORT_SIZE/2 + MODEL_Y_OFFSET); 
     rotateY.setPivotZ(VIEWPORT_SIZE/2); 

     rotateZ.setPivotX(VIEWPORT_SIZE/2 + MODEL_X_OFFSET); 
     rotateZ.setPivotY(VIEWPORT_SIZE/2 + MODEL_Y_OFFSET); 
     rotateZ.setPivotZ(VIEWPORT_SIZE/2); 
     //################ End pivot points ################\\ 

     scene.setOnMousePressed(event -> { 
      mouseOldX = event.getSceneX(); 
      mouseOldY = event.getSceneY(); 
     }); 

     scene.setOnMouseDragged(event -> { 
      rotateX.setAngle(rotateX.getAngle() - (event.getSceneY() - mouseOldY)); 
      rotateY.setAngle(rotateY.getAngle() + (event.getSceneX() - mouseOldX)); 
      mouseOldX = event.getSceneX(); 
      mouseOldY = event.getSceneY(); 

     }); 
     stage.setTitle("JavaFx3DObj"); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

我只能用一个立方体测试它,因为我没有ObjLoader/OBJFILE,但这应该让你绕一个点。

小心。如果您翻译该对象,则必须将枢轴点设置为新位置。

+0

我真的很感谢您的回答和回复。非常感谢您的回复。 –

+0

@abdelrahmanelattar是否有效? – Jhonny007

+0

是的,是的。 感谢更多的时间。 –