缩放会在 y 轴而不是 z 轴上移动相机

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

我在原点有一个 3D 盒子。我还有一个相机,它被移动到盒子上,这样我就可以在盒子周围移动相机,而不是旋转盒子。但是,使用鼠标移动相机可以正常工作(我认为),但缩放功能无法按预期工作。例如,如果我在 y 轴上移动相机,然后尝试放大,则该框将在 y 轴而不是 z 轴上移动(下面附有图片)。

初始盒

鼠标上下拖动后的方框

放大后的方框

您可能会看到,当我放大时,该框会下降得很远,而当我缩小时,它会上升。现在,我想我需要在放大/缩小时修复相机点。有什么想法如何做到这一点吗?或者任何其他可能解决问题的方法。

public Main3D() {
        root = new HBox();
        root.setAlignment(Pos.CENTER);
        xRotate = new Rotate(0, Rotate.X_AXIS);
        yRotate = new Rotate(0, Rotate.Y_AXIS);
        currAngleX = new SimpleDoubleProperty(0);
        currAngleY = new SimpleDoubleProperty(0);
        currAngleZ = new SimpleDoubleProperty(0);
        truckMaterial = new PhongMaterial();
}

private void initiate3dSphereScene() {
        // create the container/truck
        truck = new Box(Truck.WIDTH, Truck.HEIGHT, Truck.DEPTH);
        truckMaterial.setDiffuseColor(Color.SILVER.deriveColor(.3, .3, 0.4, .3));
        truck.setMaterial(truckMaterial);
        
        group = new Group();
        group.getChildren().add(truck);

        mainScene = new SubScene(group, SCREEN_WIDTH * .75, SCREEN_HEIGHT, true, SceneAntialiasing.BALANCED);
        mainScene.setFill(Color.SILVER);
        
        // set up the camera
        camera = new PerspectiveCamera(true);
        camera.getTransforms().addAll(xRotate, yRotate, new Translate(0, 0, -40));
        camera.setNearClip(1);
        camera.setFarClip(100000);
        mainScene.setCamera(camera);
        
        initiateMouseControl();
    }

private void initiateMouseControl() {
        xRotate.angleProperty().bind(currAngleX);
        yRotate.angleProperty().bind(currAngleY);
        
        mainScene.setOnMousePressed(mouseEvent -> {
            currX = mouseEvent.getSceneX();
            currY = mouseEvent.getSceneY();
            
            newX = currAngleX.get();
            newY = currAngleY.get();
        });
        
        mainScene.setOnMouseDragged(mouseEvent -> {
            currAngleX.set(newX + (currY - mouseEvent.getSceneY()));
            currAngleY.set(newY - (currX - mouseEvent.getSceneX()));
        });
        
        mainScene.addEventHandler(ScrollEvent.SCROLL, event -> {
            double zoom = event.getDeltaY();
            camera.translateZProperty().set(camera.getTranslateZ() + zoom / 10);
            camera.translateYProperty().set(currAngleY.get());
        });
        
        mainScene.setOnKeyPressed(KeyEvent -> {
            if (KeyEvent.getCode() == KeyCode.C) {
                camera.translateXProperty().set(0);
                camera.translateXProperty().set(0);
                camera.translateZProperty().set(-40);
            }
        });
    }
java javafx 3d zooming javafx-3d
1个回答
0
投票

在初始化

FieldOfView
而不是
PerspectiveCamera
对象后,更改
Camera
属性将起到作用。这会给人放大/缩小的印象。

mainScene.addEventHandler(ScrollEvent.SCROLL, event -> {
            double zoomFactor = 1.05;
            double deltaY = event.getDeltaY();
            if (deltaY < 0){
                zoomFactor = 2.0 - zoomFactor;
            }
            camera.setFieldOfView(camera.getFieldOfView() / zoomFactor);
});
© www.soinside.com 2019 - 2024. All rights reserved.