JavaFX:编码mouselook摄像头:无法围绕自身旋转

问题描述 投票:0回答:1

我一直在尝试在JavaFX上编写一个mouselook相机......

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.PointLight;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Sphere;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;

public class Example extends Application {
    private static Sphere sphere, sphere2, sphere3, sphere4;
    private static PerspectiveCamera camera;

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

    @Override
    public void start(Stage stage) throws Exception {
        // locate random objects
        sphere = new Sphere( 150 );

        sphere.setTranslateX( 0 );
        sphere.setTranslateY( 0 );
        sphere.setTranslateZ( 0 );

        sphere.setMaterial( new PhongMaterial( Color.RED ) );


        sphere2  = new Sphere( 150 );

        sphere2.setTranslateX( 0 );
        sphere2.setTranslateY( 0 );
        sphere2.setTranslateZ( 500 );

        sphere2.setMaterial( new PhongMaterial( Color.GREEN ) );

        sphere3  = new Sphere( 150 );

        sphere3.setTranslateX( 500 );
        sphere3.setTranslateY( 0 );
        sphere3.setTranslateZ( 0 );

        sphere3.setMaterial( new PhongMaterial( Color.BLUE ) );


        sphere4  = new Sphere( 150 );

        sphere4.setTranslateX( 500 );
        sphere4.setTranslateY( 0 );
        sphere4.setTranslateZ( 500 );

        sphere4.setMaterial( new PhongMaterial( Color.YELLOW ) );

        // locate the camera
        camera = new PerspectiveCamera( false );
        camera.setTranslateX( 250 );
        camera.setTranslateY( -200 );
        camera.setTranslateZ( 250 );


        // create a font of light
        PointLight light = new PointLight();

        light.setTranslateX( 250 );
        light.setTranslateY( 200 );
        light.setTranslateZ( 0 );

        Group root = new Group( sphere, sphere2, sphere3, sphere4,  light );
        Scene scene = new Scene( root, 800, 600, true);

        scene.setFill(Color.SKYBLUE);
        scene.setCamera( camera );
        scene.setOnMouseMoved( new MouseLook() );

        stage.setScene(scene);
        stage.setTitle("Mouselook rotation");
        stage.show();
    }

    static class MouseLook implements EventHandler <MouseEvent> {
        private static Rotate rotation;
        private static int oldX, newX;
        private static boolean alreadyMoved = false;

        @Override
        public void handle(MouseEvent event) {
            if ( alreadyMoved ) {
                newX = (int) event.getScreenX();

                if ( oldX < newX ) { // if mouse moved to right
                    rotation = new Rotate( 10.0,
                            // camera rotates around its location
                            camera.getTranslateX(), camera.getTranslateY(), camera.getTranslateZ(),
                            Rotate.Y_AXIS );


                } else if ( oldX > newX ) { // if mouse moved to left
                    rotation = new Rotate( -10.0,
                            // camera rotates around its location
                            camera.getTranslateX(), camera.getTranslateY(), camera.getTranslateZ(),
                            Rotate.Y_AXIS );

                }
                camera.getTransforms().addAll( rotation );

                oldX = newX;
            } else {
                oldX = (int) event.getScreenX();
                alreadyMoved = true;
            }
        }
    }
}

问题是我使用摄像机位置作为枢轴,但它会围绕场景的4个球体中的一个进行平移。

Camera movement

我已经尝试将摄像机位置设置为枢轴点,但是我使用的值并不重要,似乎枢轴永远不会改变。

camera javafx-8
1个回答
0
投票

谢谢你的提问。我也想在javafx中实现鼠标外观。我玩你的代码,这对我有用。我将PerspectiveCamera改为true,并使用了setNearClipsetFarClipCamera属性,以确保我能看到Spheres。

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.PointLight;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Sphere;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;

public class Example extends Application {
    private static Sphere sphere, sphere2, sphere3, sphere4;
    private static PerspectiveCamera camera;

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

    @Override
    public void start(Stage stage) throws Exception {
        // locate random objects
        sphere = new Sphere( 150 );

        sphere.setTranslateX( 0 );
        sphere.setTranslateY( 0 );
        sphere.setTranslateZ( 400 );

        sphere.setMaterial( new PhongMaterial( Color.RED ) );


        sphere2  = new Sphere( 150 );

        sphere2.setTranslateX( 0 );
        sphere2.setTranslateY( 0 );
        sphere2.setTranslateZ( -300 );

        sphere2.setMaterial( new PhongMaterial( Color.GREEN ) );

        sphere3  = new Sphere( 150 );

        sphere3.setTranslateX( 300 );
        sphere3.setTranslateY( 0 );
        sphere3.setTranslateZ( 0 );

        sphere3.setMaterial( new PhongMaterial( Color.BLUE ) );


        sphere4  = new Sphere( 150 );

        sphere4.setTranslateX( -300 );
        sphere4.setTranslateY( 0 );
        sphere4.setTranslateZ( 0 );

        sphere4.setMaterial( new PhongMaterial( Color.YELLOW ) );

        // locate the camera
        camera = new PerspectiveCamera( true );
        camera.setTranslateX( 0 );
        camera.setTranslateY( 0 );
        camera.setTranslateZ( 0 );
        camera.setFieldOfView(90.0);
        camera.setFarClip(500.0);
        camera.setNearClip(0.01);


        // create a font of light
        PointLight light = new PointLight();

        light.setTranslateX( 0 );
        light.setTranslateY( 0 );
        light.setTranslateZ( 0 );

        Group root = new Group( sphere, sphere2, sphere3, sphere4,  light );
        Scene scene = new Scene( root, 800, 600, true);

        scene.setFill(Color.SKYBLUE);
        scene.setCamera( camera );
        scene.setOnMouseMoved( new MouseLook() );

        stage.setScene(scene);
        stage.setTitle("Mouselook rotation");
        stage.show();
    }

    static class MouseLook implements EventHandler <MouseEvent> {
        private static Rotate rotation;
        private static int oldX, newX;
        private static boolean alreadyMoved = false;

        @Override
        public void handle(MouseEvent event) {
            if ( alreadyMoved ) {
                newX = (int) event.getScreenX();

                if ( oldX < newX ) { // if mouse moved to right
                    rotation = new Rotate( 10.0,
                            // camera rotates around its location
                            camera.getTranslateX(), camera.getTranslateY(), camera.getTranslateZ(),
                            Rotate.Y_AXIS );


                } else if ( oldX > newX ) { // if mouse moved to left
                    rotation = new Rotate( -10.0,
                            // camera rotates around its location
                            camera.getTranslateX(), camera.getTranslateY(), camera.getTranslateZ(),
                            Rotate.Y_AXIS );

                }
                camera.getTransforms().addAll( rotation );

                oldX = newX;
            } else {
                oldX = (int) event.getScreenX();
                alreadyMoved = true;
            }
        }
    }
}
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.