1

コードは次のとおりです。

import javafx.animation.Animation;
import javafx.animation.RotateTransition;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.PointLight;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Box;
import javafx.scene.shape.CullFace;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
import javafx.util.Duration;

public class CameraTest extends Application {
    public static void main(String[] args) {
        Application.launch(args);
    }

    @Override
    public void start(Stage stage) {
        Box box = new Box(100, 100, 100);
        box.setCullFace(CullFace.NONE);
        box.setTranslateX(0);
        box.setTranslateY(0);
        box.setTranslateZ(0);

        PerspectiveCamera camera = new PerspectiveCamera(false);
        camera.setTranslateX(0);
        camera.setTranslateY(0);
        camera.setTranslateZ(0);

        // Add a Rotation animation to the camera
        RotateTransition rt = new RotateTransition(Duration.seconds(2), box);
        rt.setCycleCount(Animation.INDEFINITE);
        rt.setFromAngle(0);
        rt.setToAngle(360);
        rt.setAutoReverse(true);
        rt.setAxis(Rotate.Y_AXIS);
        rt.play();

//        PointLight redLight = new PointLight();
//        redLight.setColor(Color.RED);
//        redLight.setTranslateX(250);
//        redLight.setTranslateY(-100);
//        redLight.setTranslateZ(250);

        PointLight greenLight = new PointLight();
        greenLight.setColor(Color.GREEN);
        greenLight.setTranslateX(250);
        greenLight.setTranslateY(300);
        greenLight.setTranslateZ(300);

        Group root = new Group(box, greenLight);
        root.setRotationAxis(Rotate.X_AXIS);
        root.setRotate(30);

        Scene scene = new Scene(root, 500, 300, true);
        scene.setCamera(camera);
        stage.setScene(scene);
        stage.setTitle("Using camaras");
        stage.show();
    }
}
  1. y 軸に沿って上下の動きがあると感じるのはなぜですか?
  2. カメラは立方体と同じ位置に設定されているのに、立方体が右上隅に表示されるのはなぜですか?
4

1 に答える 1

2

最初の質問について: はい、あなたが説明したように上下の動きがあります。説明は簡単です:

回転ボックスを に追加し、GroupJavadoc に従って:

グループ ノードには、このノードがレンダリングされるたびに順番にレンダリングされる子の ObservableList が含まれます。Group はその子の集合的な境界を引き継ぎ、直接サイズ変更することはできません。グループに適用される変換、効果、または状態は、そのグループのすべての子に適用されます。このような変換と効果は、このグループのレイアウト境界には含まれませんが、変換と効果がこのグループの子に直接設定されている場合、それらはこのグループのレイアウト境界に含まれます。

最後のステートメントは、ボックスに適用された回転がグループ レイアウトの境界に影響を与えていることを示しています。

シーン ルートはグループなので、そのレイアウトの変更はシーンに反映されます。

グループの Y 中心を追跡する場合:

root.boundsInLocalProperty().addListener((obs, oldBounds, newBounds)->{
        double yCenterLocal = newBounds.getWidth()/2;
        double yCenterScene = root.localToScene(new Point2D(0,yCenterLocal)).getY();
        System.out.println(yCenterScene);
    });

位置の変更が表示されます。

212.89169311523438
209.2910614013672
209.34730529785156
209.4747772216797
209.52439880371094
209.576171875

これは 2 回完全に回転した後のチャートです (720°):

ycenter

この問題を回避するには、次のような別のコンテナーを使用できますStackPane

StackPane root = new StackPane(box, greenLight);

あなたの場合、Y センターは常に 237.03555297851562 になります。

また、ボックスがシーンの中央に表示されるため、2 番目の問題も解決されます。

スタックペイン

ライトを負の Z 座標 (画面外) に移動したことに注意してください。

greenLight.setTranslateZ(-300);

また、シーンのアンチエイリアシングを使用する必要があります。

Scene scene = new Scene(root, 500, 300, true, SceneAntialiasing.BALANCED);
于 2015-08-29T10:46:56.047 に答える