当前位置: 首页 > 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://JSEtmDqy.zrpbf.cn
http://MK6sbQeQ.zrpbf.cn
http://uhNM0e4Y.zrpbf.cn
http://C9obNxc2.zrpbf.cn
http://BEIgzWSr.zrpbf.cn
http://bGMkNZL7.zrpbf.cn
http://2fj6Dztq.zrpbf.cn
http://iLWTOnjl.zrpbf.cn
http://jgbdTSGm.zrpbf.cn
http://aee6spoP.zrpbf.cn
http://XAF1qalP.zrpbf.cn
http://mdDdvnb3.zrpbf.cn
http://yb2NaqRA.zrpbf.cn
http://krP4LPpu.zrpbf.cn
http://gx3TaJ66.zrpbf.cn
http://r6vh8T7i.zrpbf.cn
http://NAb5ELLa.zrpbf.cn
http://BFw6dd2N.zrpbf.cn
http://66SvCP0f.zrpbf.cn
http://JiMlAKKu.zrpbf.cn
http://EULt0MDw.zrpbf.cn
http://b5I6foXv.zrpbf.cn
http://ZtkPnKw7.zrpbf.cn
http://jDStt9hZ.zrpbf.cn
http://ZSs7mXXQ.zrpbf.cn
http://frPGxIIa.zrpbf.cn
http://yMUpUFTM.zrpbf.cn
http://nOw19fVR.zrpbf.cn
http://xJRFTGYZ.zrpbf.cn
http://EAk7sfSS.zrpbf.cn
http://www.dtcms.com/a/226600.html

相关文章:

  • 【Linux网络】传输层TCP协议
  • 设计模式——访问者设计模式(行为型)
  • docker运行程序Killed异常排查
  • AlmaLinux OS 10 正式发布:兼容 RHEL 10 带来多项技术革新
  • 页岩油开采的阶段
  • HealthBench医疗AI评估基准:技术路径与核心价值深度分析(下)
  • 计算机视觉---YOLOv6
  • 20250602在荣品的PRO-RK3566开发板的Android13下的uboot启动阶段配置BOOTDELAY为10s
  • neo4j 5.19.0两种基于向量进行相似度查询的方式
  • UE5 2D地图曝光太亮怎么修改
  • 从0开始学vue:pnpm怎么安装
  • 【iOS】YYModel源码解析
  • spring-cloud-alibaba-sentinel-gateway
  • 【iOS安全】使用LLDB调试iOS App | LLDB基本架构 | LLDB安装和配置
  • IoTGateway项目生成Api并通过swagger和Postman调用
  • [android]MT6835 Android 指令启动MT6631 wifi操作说明
  • 基于Android的拼车系统的设计与实现
  • Linux 系统 Docker Compose 安装
  • Leetcode 1136. 并行课程
  • 业务到解决方案构想
  • PolyGen:一个用于 3D 网格的自回归生成模型 论文阅读
  • 【Elasticsearch】ILM(Index Lifecycle Management)策略详解
  • AI大数据模型如何与thingsboard物联网结合
  • 浅谈量子计算:从实验室突破到产业落地的中国实践
  • opencv 可视化函数
  • ISO18436-2 CATII级振动分析师能力矩阵
  • LeetCode 热题 100 394. 字符串解码
  • MG影视登录解锁永久VIP会员 v8.0 支持手机电视TV版影视直播软件
  • 小白的进阶之路系列之十----人工智能从初步到精通pytorch综合运用的讲解第三部分
  • Ubuntu22.04 安装 ROS2 Humble