2017-05-03 20 views
3

어떻게하면 javaFX의 3D 객체 주위를 원으로 카메라를 회전시킬 수 있습니까? 난 내가javaFX에서 객체 주위를 회전 카메라로 회전

camera.setRotate(angle); 

사용하여 자체 주위를 회전 할 수 있습니다 알고 있지만 난 물체가 여전히하려는 카메라가 회전하고 회전 축처럼 같은 장소에 포인트가 해당 객체입니다.

답변

7

일반적인 기술은 다음에 대한 응답을 정의합니다. RotateTransition around a pivot? 회전 변환을 정의한 다음 타임 라인 (또는 애니메이션 타이머)을 사용하여 회전 변환의 각도에 적절하게 애니메이션을 적용합니다. 객체를 중앙에 배치하려면 회전하기 전에 카메라를 객체의 원점으로 변환 할 수 있습니다.

여기 샘플 그냥 3D 앱이 작업을 수행하는 방법을 보여

: 카메라가 큐브 주위에 회전 샘플에서

image image

센터는 어느 장면 공동에있다 0,0,0을 세로로 표시합니다. 애니메이션 회전은 y 축 주위입니다. 샘플 이미지는 다양한 회전 각도의 스냅 샷을 보여줍니다. 장면의 객체를 클릭하면 카메라를 객체의 중심에 배치하고 객체를 중심으로 회전 할 수 있습니다.

import javafx.animation.*; 
import javafx.application.Application; 
import javafx.scene.*; 
import javafx.scene.paint.*; 
import javafx.scene.shape.*; 
import javafx.scene.transform.*; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

public class CameraRotationApp extends Application { 

    private Parent createContent() throws Exception { 
     Sphere sphere = new Sphere(2.5); 
     sphere.setMaterial(new PhongMaterial(Color.FORESTGREEN)); 

     sphere.setTranslateZ(7); 
     sphere.setTranslateX(2); 

     Box box = new Box(5, 5, 5); 
     box.setMaterial(new PhongMaterial(Color.RED)); 

     Translate pivot = new Translate(); 
     Rotate yRotate = new Rotate(0, Rotate.Y_AXIS); 

     // Create and position camera 
     PerspectiveCamera camera = new PerspectiveCamera(true); 
     camera.getTransforms().addAll (
       pivot, 
       yRotate, 
       new Rotate(-20, Rotate.X_AXIS), 
       new Translate(0, 0, -50) 
     ); 

     // animate the camera position. 
     Timeline timeline = new Timeline(
       new KeyFrame(
         Duration.seconds(0), 
         new KeyValue(yRotate.angleProperty(), 0) 
       ), 
       new KeyFrame(
         Duration.seconds(15), 
         new KeyValue(yRotate.angleProperty(), 360) 
       ) 
     ); 
     timeline.setCycleCount(Timeline.INDEFINITE); 
     timeline.play(); 

     // Build the Scene Graph 
     Group root = new Group();  
     root.getChildren().add(camera); 
     root.getChildren().add(box); 
     root.getChildren().add(sphere); 

     // set the pivot for the camera position animation base upon mouse clicks on objects 
     root.getChildren().stream() 
       .filter(node -> !(node instanceof Camera)) 
       .forEach(node -> 
         node.setOnMouseClicked(event -> { 
          pivot.setX(node.getTranslateX()); 
          pivot.setY(node.getTranslateY()); 
          pivot.setZ(node.getTranslateZ()); 
         }) 
       ); 

     // Use a SubScene 
     SubScene subScene = new SubScene(
       root, 
       300,300, 
       true, 
       SceneAntialiasing.BALANCED 
     ); 
     subScene.setFill(Color.ALICEBLUE); 
     subScene.setCamera(camera); 
     Group group = new Group(); 
     group.getChildren().add(subScene); 

     return group; 
    } 

    @Override 
    public void start(Stage stage) throws Exception { 
     stage.setResizable(false); 
     Scene scene = new Scene(createContent()); 
     stage.setScene(scene); 
     stage.show(); 
    } 

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

코드를 보내 주셔서 감사합니다. 매우 도움이됩니다. – tokyo