opengl下缩放与拖动的问题记录

【OpenGL】鼠标点击获取世界坐标 【OpenGL】鼠标点击获取世界坐标 标签(空格分隔): OpenGL 起因 因为最近在做图形学相关毕设,需要时间鼠标交互获取三维坐标(世界坐标系)。于是在网上查了一些博客与资料,放进自己代码中,效果怎么都不对。于是才自己静下心来,好好研究。 OpenGL中的坐标系 OpenGL总共有5个坐标系,它们分别是: 局部空间或称物体空间 世界空间 观察空间或称视觉空间 ... 阅读详情

1.在设计地图的缩放与拖动时,发生了若缩放1/2后,拖动地图时,鼠标移动的距离是实际移动的位移的1/2。 究其原因,在于gltranslate函数的调用位置。

 

拖动的实现如下:将拖动前后鼠标的屏幕坐标转换为世界坐标,计算位移x后,调用gltranslate函数移动x位移。

先有如下讨论(1):

又因为缩放与拖动操作的对应性:如果先缩放地图,后拖动地图。由于opengl命令与实际操作反序,因此应该先执行拖动,后执行缩放。 但是因为缩放与拖动可在任意时间点触发,因此无法知道地图操作的具体顺序。 因此采用在modelview矩阵的按相同的顺序左乘操作命令即可(opengl命令与操作反序的原因是opengl是将当前矩阵右乘操作矩阵),且操modelview矩阵的当前矩阵仅仅为若干地图操作的结果,不包含任何其他变化。(若有视图矩阵变化部分,则将该变化放到投影矩阵里吧。 Opengl渲染的结果=投影矩阵*视图模型矩阵*坐标点)。

根据讨论(1),该解决方案在面对先缩放1/2,再拖动地图,处理流程相当于:

glUnproject()

glTranslate()

glScale(1/2);

model(); //在局部坐标系下,或者说经过变换前的世界坐标系下绘制模型

 

出现问题的原因在于glUnproject。glUnproject返回的坐标是model层次上的坐标,即未经过任何变化的世界坐标系。而拖动地图时,拖动的是经过缩放的坐标系。  这样,利用缩放前的距离去拖动缩放后的地图,就会导致本该移动1m(缩放前的世界坐标系下的1m)最后成了缩放后移动1m,即相当于缩放前2m的距离。

 

将modelview矩阵的结构改为:

[缩放n*缩放n-1。。。*缩放*缩放1]*当期矩阵*[拖动m*。。。拖动1]。

即 缩放与拖动分为两部分乘,其中每个集合内部都是逆序的。

假设当前矩阵为A,当碰到缩放n操作时,将对应的操作矩阵Sn*A即可 。然而,对于拖动矩阵,如果直接右乘,无法保证其逆序。因为你不知道拖动m何时出现。而opengl无法再上述结构中进行插入操作(事实上,新操作甚至只能插入上述操作序列的最右端)。幸好,由于拖动矩阵具有交换律。因此直接乘吧。。。。

最终解决方案:

将modelview矩阵的结构改为:

[缩放n*缩放n-1。。。*缩放*缩放1]*当期矩阵*[拖动1*。。。拖动m]。


_________________________________________________________________________

7-19:地图的缩放应该在标准坐标系下进行比较方便。 即对已经完成 模型视图映射、投影映射、坐标规范化后的数据进行操作


Qt+OpenGL三维坐标系交互实现(三):动态旋转与缩放控制 本文详细讲解了在Qt+OpenGL三维坐标系中实现动态交互功能的核心技术。通过解析OpenGL矩阵变换栈的原理,结合Qt事件处理机制,逐步实现了鼠标拖拽旋转、滚轮缩放以及右键平移等关键交互操作,并提供了性能优化与常见问题排查的实用建议,帮助开发者构建流畅、直观的三维可视化应用。 阅读详情

相关推荐

QT QGraphicsView 精准缩放:基于鼠标位置的动态锚点技术解析

本文深入解析了QT QGraphicsView中基于鼠标位置的动态锚点缩放技术(AnchorUnderMouse),解决了默认缩放导致的视图偏移问题。通过详细讲解坐标转换原理、完整代码实现及常见问题解决方案,帮助开发者实现精准的鼠标跟随缩放功能,提升图形界面交互体验。

weixin_29276847的博客 228

opengl-第8章:移动,缩放,旋转

新版本1.8的特性 1. 加入了复合模型Model对象 模型对象直接拥有贴图,绘制数据,Shader复合而成 现在定义的模型可以直接指定贴图,数据,并且有默认的shader,同时添加了两个函数 initAppendOp:指定初始化的一些操作 drawAppendOp:在渲染过程中的一些操作 另外,Model对象直接提供了move,scale,rotate操作 Transform操作 Transform矩阵 在opengl里面,使用Transform矩阵进行变换 所谓的Transform矩阵就是一个4

qq_37080133的博客 1420

Qt QGraphicsScene QGraphicsView QGraphicsItem学习记录

一.场景(QGraphicsScene) QGraphicsScene 提供了图形视图框架的场景,相当于一块画布,并具有以下功能。 1.一个管理大量图形项的快速接口。 2.向每个图形项传播事件 3.管理图形项的状态,比如选择,焦点处理等 4.提供无转换的渲染功能,主要用于打印 简单地一个场景使用 1 QGraphicsScene scene;//场景 2 scene.addText("Hello, world!");//添加文本图形项 3 QGraphicsView view(&scene);//设

我不是码农的博客~~~ 2092

OpenGL超级宝典(第7版)笔记17 位移、旋转、缩放、观察、透视矩阵,三维空间的观察移动

OpenGL超级宝典(第7版)笔记17 位移、旋转、缩放、观察、透视矩阵 实现3维观察移动 文章目录OpenGL超级宝典(第7版)笔记17 位移、旋转、缩放、观察、透视矩阵 实现3维观察移动前言1 变换矩阵1.1 位移矩阵1.2 缩放矩阵1.3 旋转矩阵遗留的问题:四元数如何定义 如何使用1.4 矩阵的顺序2 观察矩阵3 透视矩阵4 向量、矩阵基础运算的实现5 变换、观察、透视矩阵的实现6 空间中的三角形7 总结 前言 我们上次介绍了坐标系,向量,矩阵,介绍了他们的一些基础计算。我们下面开始就要开始逐渐

qq_44016525的博客 1221

Qt OpenGL(三十五)——Qt OpenGL 核心模式-点云(斯坦福兔子)

是一个数据集,数据集中的每个点代表一组X、Y、Z几何坐标和一个强度值,这个强度值根据物体表面反射率记录返回信号的强度。我以斯坦福兔子为例,来绘制点云。我们在平时的项目中,有的时候会遇到,激光雷达等这些设置采集的数据集,不管是在机器人、扫地机、还是车载激光雷达等设备上,对于测距的的数据的采集,得到的就是点云数据。一川将会在上一篇,三维坐标系的基础上,添加斯坦福兔子的绘制。可以通过鼠标滚轮的滑动对点云数据实现缩放,通过鼠标拖动,实现对三维坐标系和斯坦福兔子进行旋转。本篇绘制简单的点云数据,展示点云的绘制过程。

ifeng12358的博客 2358

Qt无边框窗口完整实现:拖动缩放阴影与跨平台避坑指南

桌面应用开发中,窗口框架与用户交互体验密不可分。系统原生边框虽功能完备,却难以与产品视觉风格统一,尤其在跨平台场景下,不同系统的窗口外观差异显著。为此,基于Qt的自定义无边框窗口方案成为许多客户端界面设计的核心需求。其原理是通过设置窗口标志去除系统框架,并利用事件处理机制自行实现窗口移动、边缘缩放、阴影圆角等能力,从而在定制化与交互性能之间取得平衡。该技术广泛应用于播放器、设计工具、即时通讯等追求沉浸式体验的桌面应用中。内容从基础拖拽实现出发,系统梳理了自绘标题栏、8方向缩放、跨平台差异处理及常见踩坑点,为

weixin_34396902的博客 1322

opengl 教程(11) 平移/旋转/缩放

原帖地址:http://ogldev.atspace.co.uk/www/tutorial11/tutorial11.html       在前面的教程中,我们通过矩阵变化实现了物体在三维空间的平移、旋转、缩放操作。在本篇教程中,我们来实现这三种的变化的组合操作。通常情况下,我们会先缩放三维模型,使得它和其它物体大小相匹配,然后会旋转该物体,使得它朝向正确的方向,最后则是平移操作。为了实现上...

weixin_33910385的博客 537

ATE自动化测试设备:硬件与软件的完美协同

本文深入解析了ATE自动化测试设备如何通过硬件与软件的完美协同,实现高效、精准的电子产品测试。文章详细阐述了ATE系统的硬件架构(如测试控制器、仪器模块、开关矩阵)与软件层次(如测试管理、仪器控制、数据分析),并结合实战案例,揭示了软硬件协同设计在提升测试效率与可靠性中的关键作用。

weixin_29218509的博客 166

关于在Opengl中先平移后旋转和先旋转后平移的效果不一样的原因

一、现象 在OpenGL中先移动后旋转与先旋转后移动的最终效果是并不一定相同的,也就是说在Opengl中如果调用函数glTranslatef和函数glRotatef的次序不同,即使参数一样,效果也可能会不同。下面我们通过两段程序说明该问题。 二、代码 如下所示,在vs2015中新建Win32程序: 输入以下代码: #include <windows.h>...

崔杰城的博客 5296

MATLAB实战:手把手教你实现WVD信号分析(附完整代码与避坑指南)

本文通过MATLAB实战,手把手教你实现Wigner-Ville分布(WVD)信号分析。文章提供了从零构建WVD函数的完整代码,并重点解析了使用解析信号、处理交叉项、优化计算效率等关键避坑指南,帮助工程师高效处理非平稳信号,获得高分辨率的时频分析结果。

purple的博客 1081

【实战技巧】matplotlib中文标签显示问题的3种高效解决方案

本文详细介绍了解决matplotlib中文标签显示问题的3种高效方法,包括修改字体设置、临时指定字体和修改后端配置。针对不同操作系统和环境提供了实用技巧,帮助开发者快速解决中文显示为方框的常见问题,提升数据可视化效果。

weixin_30855099的博客 170

【OpenGL】鼠标取点画多边形、平移、旋转、缩放、拖拽点等

参考文章:openGL 实现绘制、修改多边形 已经实现的功能: 1. 鼠标取点画多边形,用的自带的glBegin(GL_LINE_LOOP)方法,没有填充 2. 删除某个点 3. 拖拽某个点 4. 移动图形 5. 旋转多边形(角度>90有点问题,可以改为每次转动固定的角度) 6. 缩放多边形,基准点为极大坐标值与极小坐标值取平均(不是很严谨) 代码: #includ...

CS之路 5877

使用moveit!控制真实机械臂(5)——编写真实机械臂节点中的action服务程序

上一篇文章中,我们简要介绍了ROS中action的基本知识,为了控制真实机械臂,我们已经修改了moveit配置文件,使得moveti启动后具备一个control_msgs::FollowJointTrajectoryAction类型的action客户端,接下来,我们完成该类型action的另一半,编写C++程序来实现action的服务端。由于底层机器人控制程序一般差别都很大,这里展示的只是编程要点...

爱学习的草莓熊 1万+

QT中学习Opengl---(旋转、平移、缩放)

前言: 本文的代码是 LearnOpenGL 中对应代码,这里提供学习,大家喜欢的可去官方网站去看看: LearnOpenGL-CNhttps://learnopengl-cn.readthedocs.io/zh/latest/本章简单记录,使用旋转、平移、缩放。矩阵相关计算是基础东西,记得以前还问老师,学习高代有啥用。哈哈,一切都会用的。 缩放: 基本的矩阵变换: 这样,对应的x y z 对应放大对应倍数。 平移 基本的矩阵变换: 这样就是平移对应位置了。 旋转 沿...

比卡丘不皮的博客 4722

ControlCAN.dll开发适配USBCAN_E/2E_U设备

摘要:本文提供了USBCAN_E/2E_U设备的配置指南:1)安装专用驱动;2)获取最新的ControlCAN.dll文件;3)修改VCI调用顺序,新增VCI_SetReference函数设置波特率;4)使用工具计算波特率配置值,并给出了常见波特率对应的代码参考值(如500K对应0x060007)。配置过程强调使用特定工具计算精确的波特率参数,并提供了相关软件下载链接。

weixin_43969033的博客 387

深入AutoSar诊断协议栈:当ECU报故障时,FiM模块是如何悄悄“阉割”功能的?

本文深入解析AutoSar诊断协议栈中FiM模块的工作原理,揭示ECU报故障时如何通过Inhibition Counter和位运算技术实现功能静默降级。探讨FiM在故障处理链中的关键角色,包括功能权限仲裁、降级策略执行和系统安全兜底,并分享实战调试技巧与进阶应用案例。

weixin_30673611的博客 174

基于Visual C++ 2015 实现OpenGL鼠标控制坐标系旋转、缩放、移动

本例子实现是基于上一篇文章“基于Viusal C++ 2015 MFC单文档程序中搭建OpenGL框架” 在C*****View.cpp添加一下代码: void CLiDARView::OnMouseMove(UINT nFlags, CPoint point) {     // TODO: 在此添加消息处理程序代码和/或调用默认值     int X_Point = point.x - Ol...

qq_34911636的博客 2673

基于Simulink的PID控制防抱死制动系统(ABS)建模与仿真

防抱死制动系统(Anti-lock Braking System,简称ABS)是一种用于防止车辆在紧急制动时车轮完全抱死的技术。通过实时监测车轮速度并调节制动力,ABS能够显著提高车辆的制动性能和操控稳定性,从而减少交通事故的发生。PID(比例-积分-微分)控制器因其结构简单、性能稳定且易于实现而被广泛应用于ABS控制系统中。本项目旨在通过MATLAB/Simulink平台设计和验证一个基于PID控制的ABS系统,重点研究PID参数调优方法、系统动态响应特性以及制动过程中的滑移率控制能力。

MHD0815的博客 484

Qt-for-鸿蒙PC HarmonyOS-无边框窗口缩放开发实战

Qt for HarmonyOS 无边框窗口缩放开发实战 本文介绍在HarmonyOS上使用Qt/QML实现无边框窗口缩放功能的开发实践。项目通过MouseArea检测窗口边缘位置,使用位运算标识缩放方向,实现了窗口四边和四角的拖拽缩放功能。关键技术点包括: 无边框窗口设计 - 去除系统默认边框,实现自定义窗口外观 边缘检测机制 - 通过位运算组合判断鼠标位置(左/右/上/下/角落) 动态光标反馈 - 根据位置自动切换光标样式(水平/垂直/斜向) 事件处理优化 - 正确处理鼠标事件,将边缘缩放与SplitV

wanmeijuhao的博客 5603

2025年5月架构设计师论文真题回顾,附写作技巧、所涉知识点及参考范文(三)

本文主要回顾2025年上半年(2025-5-24)系统架构设计师考试下午论文的题目,同时附带写作技巧、所涉知识点及参考范文。试题三:多模型数据库及应用。

一几文的编程学习笔记。 629

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Qt for HarmonyOS 无边框窗口缩放开发实战

在HarmonyOS应用开发中,无边框窗口和自定义窗口缩放是高级UI交互需求。本项目基于Qt/QML框架,实现了一个功能完整的无边框窗口缩放应用,支持通过鼠标在窗口边缘拖拽来调整窗口大小,同时集成了SplitView分割布局功能,展示了如何在Qt for HarmonyOS中实现自定义窗口交互和复杂布局管理。

hahjee的博客 685

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

计算机图形学(一)——opengl实现三维立方体添加纹理光照与材质、键盘鼠标控制平移旋转和放大缩小

1.实验要求: 用OpenGL和C语言编写一个带纹理和材质的一个立方体的交互式程序。 1)要求生成一个在立方体,并在立方体的六个面上并分别实现不同的纹理映射和材质。纹理的类型为BMP图片纹理,材质类型可以自己设计。例如,三个面上实现纹理映射的头像和生活照,另外三个面上实现材质(金属、塑料等)。 2)可以利用鼠标和键盘进行交互,实现该立方体的旋转、平移和缩放。 2.实验效果图如下: 正常情况下 加...

诶你爱我吗的博客 8832

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

OpenGL初体验

本实验基于Visual Studio 2010和OpenGL搭建了地理可视化系统,实现了四川省行政区划边界及成都标记点的绘制与交互功能。主要内容包括:1)配置OpenGL开发环境并理解其渲染管线;2)通过Python转换Shapefile边界数据为经纬度坐标;3)实现地理坐标到OpenGL屏幕坐标的投影变换;4)使用GL_LINE_LOOP绘制行政区划边界,并以红点标记成都位置;5)通过回调函数实现鼠标滚轮缩放(0.1-20倍范围)和左键平移功能。

因趣斯听—博客 300

opengl鼠标操作(包括滚轮操作)

<br />滚轮操作<br /> <br />#define GLUT_WHEEL_UP 3 //定义滚轮操作 #define GLUT_WHEEL_DOWN 4 void processMouse(int button, int state, int x, int y) { if (state == GLUT_UP && button == GLUT_WHEEL_UP) { zoom += 0.03; gl

timzc的专栏 1万+

QT结构基础----之 QGraphicsScene QGraphicsView QGraphicsItem学习记录

一.场景(QGraphicsScene) QGraphicsScene 提供了图形视图框架的场景,相当于一块画布,并具有以下功能。 1.一个管理大量图形项的快速接口。 2.向每个图形项传播事件 3.管理图形项的状态,比如选择,焦点处理等 4.提供无转换的渲染功能,主要用于打印 简单地一个场景使用 QGraphicsScene scene;//场景 scene.addText...

weixin_39609623的博客 1310

freeglut_光照设置_材质设置_笔记与心得

详细记录下最近被老师和师兄掐着脖子撵着做的OPENGL显示和鼠标键盘交互,突然意识到软件著作权不会查重,并且最终的是MFC+OPENGL的模式,和单独opengl代码是不同的~那我就放心开源了~ (1)最终效果包含8w个点以及8w点依据读取顺序拟合成QUADS,这里解释下拟合,OPENGL是不自带拟合函数的,但是可以通过用顶点数组、序列数组来将四个四个点,以QUAD图元形式画出,这就算是拟合了~...

qq_33656970的博客 662
上一篇: vs2010下qt的intellisense
下一篇: poj 1013——用运算模拟变换操作
HelloElite
博客等级 码龄14年 2粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值