2016-08-23 31 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

[回転]オブジェクトにピボット座標を設定すると、どの点を回転させたいかを定義できます。オブジェクトの中心をピボットとして設定する必要があります。 – 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

はい、そうです。ありがとうございます。 –

関連する問題