当前位置: 首页 > article >正文

Qt OpenGL 实现交互功能(如鼠标、键盘操作)

一、基本概念

1. Qt 事件系统与 OpenGL 渲染的协同

Qt 提供了完善的事件处理机制,而 OpenGL 负责图形渲染。交互的实现本质上是:

  • 事件捕获:通过 Qt 的事件系统(如 mousePressEventkeyPressEvent)捕获用户输入。

  • 状态更新:根据输入事件更新场景状态(如相机位置、模型变换矩阵等)。

  • 重绘触发:调用 update() 请求重绘,触发 paintGL() 重新渲染更新后的场景。

2. 坐标系转换

鼠标交互中的坐标系问题

  • 屏幕坐标系(2D):鼠标事件的坐标 (x, y) 是屏幕像素坐标,原点在窗口左上角。

  • OpenGL 坐标系(3D):归一化设备坐标(NDC),范围为 [-1, 1],原点在中心。

转换方法

  • 鼠标坐标需通过视口变换和投影/视图矩阵的逆矩阵转换到 3D 世界坐标(例如实现鼠标拾取)。

  • 示例代码片段:

    cpp

    // 将鼠标坐标转换为 NDC
    float x_ndc = (2.0f * mouseX) / width() - 1.0f;
    float y_ndc = 1.0f - (2.0f * mouseY) / height();

3. 相机控制原理

第一人称/第三人称相机

  • 键盘控制移动:通过修改相机位置 cameraPos,结合前向向量 cameraFront 和上向量 cameraUp

    cpp

    // 前进:沿前向向量移动
    cameraPos += cameraSpeed * cameraFront;
  • 鼠标控制视角:通过鼠标移动计算偏航角(yaw)和俯仰角(pitch),更新 cameraFront

    cpp

    QVector3D front;
    front.setX(cos(yaw) * cos(pitch));
    front.setY(sin(pitch));
    front.setZ(sin(yaw) * cos(pitch));
    cameraFront = front.normalized();

投影矩阵的作用

  • 透视投影perspective):模拟人眼视角,通过 fov(视野)控制缩放效果。

    cpp

    projection.perspective(fov, aspectRatio, nearPlane, farPlane);

4. 矩阵变换链

OpenGL 的渲染流程依赖以下矩阵变换:

  1. 模型矩阵(Model):定义物体自身的变换(平移、旋转、缩放)。

  2. 视图矩阵(View):定义相机的位置和朝向(通过 lookAt 计算)。

  3. 投影矩阵(Projection):定义如何将 3D 场景投影到 2D 屏幕。

http://www.lryc.cn/news/2402322.html

相关文章:

  • 【Go语言基础【3】】变量、常量、值类型与引用类型
  • 8天Python从入门到精通【itheima】-69~70(字符串的常见定义和操作+案例练习)
  • 在 Linux 中查看文件并过滤空行
  • GC1809:高性能音频接收与转换芯片
  • 项目实战——C语言扫雷游戏
  • 【Java】CopyOnWriteArrayList
  • 【JS进阶】ES6 实现继承的方式
  • mac 电脑Pycharm ImportError: No module named pip
  • C#入门学习笔记 #8(委托)
  • CSS 3D 变换中z-index失效问题
  • Vue3 中使用 i18n
  • vue:当前对象添加对应值
  • Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(七):消息框交互功能添加
  • JavaScript 核心原理深度解析-不停留于表面的VUE等的使用!
  • 【计算机网络】网络层IP协议与子网划分详解:从主机通信到网络设计的底层逻辑
  • 基于WSL搭建Ubnutu 20.04.6 LTS(二)-部署Docker环境
  • 【图像处理入门】6. 频域图像处理:傅里叶变换与滤波的奥秘
  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序的生态农庄留存运营策略研究
  • Jenkins实现自动化部署Springboot项目到Docker容器(Jenkinsfile)
  • 【Linux】Git原理与使用
  • Cursor 工具项目构建指南: Python 3.8 环境下的 Prompt Rules 约束
  • A*算法实现原理以及实现步骤(C++)
  • Devops自动化运维---py基础篇一
  • 平安养老险蚌埠中心支公司开展金融宣教活动
  • 游戏设计模式 - 子类沙箱
  • java-springboot文件上传校验之只允许上传excel文件,且检查不能是脚本或者有害文件或可行性文件
  • openvino如何在c++中调用pytorch训练的模型
  • Redisson简明教程—你家的锁芯该换了
  • 48V带极性反接保护-差共模浪涌防护方案
  • Python----目标检测(使用YOLO 模型进行线程安全推理和流媒体源)