如何在JavaFX中使相机围绕三维对象旋转?我知道可以使用以下方法将其围绕自身旋转:
camera.setRotate(angle);
但是我希望一个物体保持不动,相机旋转并指向同一点,就像旋转轴是那个物体一样。
如何在JavaFX中使相机围绕三维对象旋转?我知道可以使用以下方法将其围绕自身旋转:
camera.setRotate(angle);
这个示例只是演示了如何为3D应用程序做到这一点:
在这个示例中,摄像机围绕立方体旋转,其中心位于场景坐标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);
}
}