You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:54:01