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

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.xdnf.cn/news/766423.html

相关文章:

  • leetcode90.子集II:排序与同层去重的回溯优化策略
  • 【leetcode】459.重复的子字符串
  • MyBatis源码解析:从 Mapper 接口到 SQL 执行的完整链路
  • 正则表达式在Java中的应用(补充)
  • 初识CSS3
  • OIer常用的软件
  • 【001】利用github搭建静态网站_essay
  • 并发编程的源头
  • Flink CDC将MySQL数据同步到数据湖
  • C++ 标准输入输出 -- <iostream>
  • 【深度学习新浪潮】多模态模型如何处理任意分辨率输入?
  • LazyOwn RedTeam/APT 框架是第一个具有人工智能驱动的 CC 的 RedTeam 框架
  • 6.linux文本内容显示cat,more,less
  • 第七部分:第五节 - 数据关系与进阶查询 (TypeORM):仓库里复杂的配料组合
  • 第1篇:数据库中间件概述:架构演进、典型方案与应用场景
  • 微服务常用日志追踪方案:Sleuth + Zipkin + ELK
  • SCAU8642--快速排序
  • C++ 内存泄漏检测器设计
  • 7.文本内容处理sort,uniq,out,cat,comm,diff
  • NX869NX874美光固态颗粒NX877NX883
  • [HTML5]快速掌握canvas
  • 在 Linux 服务器上无需 sudo 权限解压/打包 .7z 的方法
  • C++ - 数据处理之数值转不同进制的字符串(数值转十进制字符串、数值转八进制字符串、数值转二进制字符串、数值转十六进制字符串)
  • 黑马程序员C++核心编程笔记--4 类和对象--多态
  • 《信号与系统》--期末总结V1.0
  • linux 的devmem2 调式使用说明
  • Vue-3-前端框架Vue基础入门之VSCode开发环境配置和Tomcat部署Vue项目
  • 常见ADB指令
  • Vue-4-前端框架Vue基础入门之Vue的常用操作
  • opencv调用模型