QT与OPENGL二:用鼠标控制lookat视角

2024-06-03 04:32

本文主要是介绍QT与OPENGL二:用鼠标控制lookat视角,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里写图片描述
这里写图片描述

但这个求坐标的x,y,z和lookat的右手坐标系不太一样,需要调换一下x,y,z顺序。
单独控制lookat的左右,和上下比较容易,合在一起遇到了些问题,主要是涉及到了球坐标。

当按下鼠标时记录当前点坐标。
mousePoint.push(mousePressPosition);
当移动鼠标时计算移动差
mouseCurPosition = QVector2D(e->localPos());
QVector2D offset;
if (mousePoint.size() == 1){
QVector2D mouseLastPosition = mousePoint.top();
offset = mouseCurPosition -mouseLastPosition ;
offset.setX(-offset.x());//由于方向问题,这里取反
}

每一次鼠标按下,都重新计算当前俯仰角
curPitch = 0;
curYaw = 0;
float camX = 0;
float camY = 0;
float camZ = 0;

//球坐标的计算,先计算球坐标夹角
curYaw = qAcos(offset.y()/5000 / radius );
curYaw = qRadiansToDegrees(curYaw);
//把求坐标的角度转换为笛卡尔坐标,即俯仰角
curYaw = 90 -curYaw;
//通过俯仰角计算偏航角
curPitch = qAsin(offset.x() / (radius * qCos(curYaw)) / 5000 );
curPitch = qRadiansToDegrees(curPitch);
//球坐标系中的x y z
camX = radius * qCos(lastYaw + curYaw)* qSin(lastPitch + curPitch) ;
camY = radius * qSin(lastYaw + curYaw);
camZ = radius * qCos(lastYaw + curYaw)* qCos(lastPitch + curPitch) ;
camPos.setX(camX);
camPos.setY(camY);
camPos.setZ(camZ);
当鼠标抬起,记录上一次俯角,仰角,一遍下一次顺畅使用
if (mousePoint.size() == 1)
mousePoint.pop();
lastPitch += curPitch;
lastYaw += curYaw;

lookat属性设置
QVector3D Pos(0, 0, 5); //pos
QVector3D Front(0, 0, 0); //target
QVector3D Up(0, 1, 0); //up direction
matrix.lookAt(camPos, camFront, camUp);

这篇关于QT与OPENGL二:用鼠标控制lookat视角的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026014

相关文章

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹