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

. 나는 ObjLoader/ObjFile을 가지고 있지 않기 때문에

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); 
    } 
} 

난 단지 큐브로 테스트 할 수 있지만 이것은 당신이 하나의 지점을 주위 회전 할 수 있도록해야합니다 그래서 코드는 것 같습니다.

조심해. 객체를 번역하는 경우 피벗 점을 새 위치로 설정해야합니다.

+0

저는 정말로 귀하의 답변과 답변에 감사드립니다. 답장 해주셔서 매우 감사합니다. –

+0

@abdelrahmanelattar가 작동 했습니까? – Jhonny007

+0

예, 그렇습니다. 감사합니다 더 많은 시간을 . –

관련 문제