2016-08-23 2 views
0

Мое приложение читает obj-файл, используя интерактивную библиотеку mesh и сохраняя его в 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

да, есть. спасибо больше времени. –

Смежные вопросы