如何让相机在javaFX中围绕3d对象旋转?我知道我可以使用
围绕它自己旋转camera.setRotate(angle);
但我希望一个物体静止,相机旋转并指向同一个点,就像旋转轴一样。
答案 0 :(得分:8)
常规技术定义了以下答案:RotateTransition around a pivot?您可以定义旋转变换,然后使用时间轴(或动画计时器)根据需要设置旋转变换的角度。如果希望对象居中,则可以在旋转之前将摄像机转换为对象的原点。
此处的示例仅演示了如何为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);
}
}