绕另一个对象旋转(轨道)节点(javafx-2)

时间:2012-03-28 13:20:55

标签: rotation javafx-2

我在制作简单的太阳/地球动画方面遇到了麻烦 在下面的示例中,圆圈应围绕矩形进行轨道运动 为此,我创建一个新组,附加偏移0的矩形和偏移50的圆。
现在当旋转组时,我认为矩形应该围绕自身旋转,圆圈应围绕矩形运行。

但似乎两个形状都有一个偏移并围绕一个看不见的中心旋转。

import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        // create root node
        Group root = new Group();
        Scene scene = new Scene(root, 640, 400);
        primaryStage.setScene(scene);

        // translate root node to center of the screen
        root.setTranslateX(320);
        root.setTranslateY(200);

        // create scene
        createScene(root);

        primaryStage.show();
    }

    private void createScene(Group root) {
        Group branch = new Group();
        root.getChildren().add(branch);

        // create a recangle, which will be added to the branch
        Rectangle r = new Rectangle(40, 20);
        branch.getChildren().add(r);

        // circle should orbit around the rectangle
        Circle c = new Circle(10);
        branch.getChildren().add(c);
        c.setTranslateY(-50);

        // rotate the branch
        Timeline rot = new Timeline();
        rot.setCycleCount(Timeline.INDEFINITE);
        rot.setRate(1);
        rot.getKeyFrames().addAll(
                new KeyFrame(Duration.ZERO, new KeyValue(
                        branch.rotateProperty(), 0)),
                new KeyFrame(Duration.seconds(5), new KeyValue(branch
                        .rotateProperty(), 360)));
        rot.playFromStart();

    }

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

1 个答案:

答案 0 :(得分:3)

请注意,任何物体的旋转都发生在其中心附近。解决问题的最简单方法是使用StackPane而不是Group。 StackPane默认将所有对象放到它的中心。

private void createScene(Group root) {
    Pane branch = new StackPane();
    root.getChildren().add(branch);