JavaFX实现3D第一人称相机,参考StackOverflow方案仍无法运行求助
JavaFX第一人称相机不生效问题修复
你当前的代码主要有几个问题导致第一人称相机无法正常工作:
- 直接使用
PerspectiveCamera自带的rotate、rotationAxis属性,默认旋转逻辑是绕场景原点计算,无法实现基于相机自身位置的第一人称视角旋转 - 未开启SubScene的深度缓冲,3D物体渲染会出现层级错位
- 未调整相机近裁剪面参数,默认值过大可能导致近处物体被裁剪
修复后的完整代码
package application; import javafx.application.Application; import javafx.scene.PerspectiveCamera; import javafx.scene.Scene; import javafx.scene.SubScene; import javafx.scene.control.Slider; import javafx.scene.layout.BorderPane; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.scene.paint.PhongMaterial; import javafx.scene.shape.Box; import javafx.scene.transform.Rotate; import javafx.stage.Stage; public class Main extends Application { BorderPane pane = new BorderPane(); Box box = new Box(150, 150, 600); SubScene sub = new SubScene(new Pane(box), 600, 600, true, null); // 开启深度缓冲 PhongMaterial mat = new PhongMaterial(Color.RED); PerspectiveCamera cam = new PerspectiveCamera(); // 定义两个独立旋转,分别控制偏航(左右看)和俯仰(上下看) Rotate yaw = new Rotate(0, Rotate.Y_AXIS); Rotate pitch = new Rotate(0, Rotate.X_AXIS); @Override public void start(Stage stage) throws Exception { // 先加旋转变换,再加后续平移,保证旋转基于相机自身位置 cam.getTransforms().addAll(yaw, pitch); // 调整近裁剪面,避免近处物体被裁剪 cam.setNearClip(0.1); sub.setCamera(cam); box.setMaterial(mat); box.setManaged(false); box.setTranslateX(300); box.setTranslateY(300); box.setRotationAxis(Rotate.X_AXIS); box.setRotate(45); // 加个旋转方便查看3D效果 box.setTranslateZ(100); stage.setScene(new Scene(pane)); stage.sizeToScene(); Slider slider1 = new Slider(-180, 180, 0); slider1.valueProperty().bindBidirectional(yaw.angleProperty()); pane.setCenter(sub); pane.setBottom(slider1); stage.centerOnScreen(); stage.show(); } public static void main(String[] args) { launch(args); } }
关键修改说明
- SubScene构造时第三个参数传true开启深度缓冲,保证3D物体的前后层级渲染正确
- 给相机添加了两个独立的
Rotate变换,旋转变换放在所有平移变换之前,这样旋转是围绕相机自身的位置计算,符合第一人称的操作逻辑 - 调整相机近裁剪面为0.1,避免距离相机过近的物体被误裁剪
- 滑块绑定自定义的yaw旋转角度属性,拖动即可实现左右转动视角,如需上下视角控制,新增滑块绑定pitch的angle属性即可
内容的提问来源于stack exchange,提问作者mousekip
相关产品推荐
相关产品推荐

