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实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

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中控制视频播放