2017-05-03 62 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