我在原点有一个 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);
}
});
}
在初始化
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);
});