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

原创 2015年07月09日 02:02:03

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

 

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

先有如下讨论(1):

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

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

glUnproject()

glTranslate()

glScale1/2);

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

 

出现问题的原因在于glUnprojectglUnproject返回的坐标是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:地图的缩放应该在标准坐标系下进行比较方便。 即对已经完成 模型视图映射、投影映射、坐标规范化后的数据进行操作


opengl实现图形平移旋转缩放

  • 2016年02月26日 18:53
  • 2KB
  • 下载

【一步步学OpenGL 8】 -《缩放变换》

教程8缩放变换原文: http://ogldev.atspace.co.uk/www/tutorial08/tutorial08.html背景缩放变换非常简单,它的目的是增大或者缩小物体的尺寸。比如你...
  • cordova
  • cordova
  • 2016年09月17日 00:06
  • 3701

[OpenGL]用鼠标拖拽图形移动

今天做计算机图形学实验。题目布置了写程序使图形移动,于是我就写了这个程序。 使用的环境是Code::Blocks + GLUT,Code::Blocks配置GLUT实现OpenGL的教程可以看这篇:...
  • Snow_Me
  • Snow_Me
  • 2016年12月14日 23:29
  • 2444

[OpenGL]利用OpenGL、GLUT实现图形投影、点选和图形拖拽

  • 2016年01月12日 17:32
  • 249KB
  • 下载

【一步步学OpenGL 8】 -《缩放变换》

教程8缩放变换原文: http://ogldev.atspace.co.uk/www/tutorial08/tutorial08.html背景缩放变换非常简单,它的目的是增大或者缩小物体的尺寸。比如你...
  • cordova
  • cordova
  • 2016年09月17日 00:06
  • 3701

OpenGL实现二维图的缩放

严格说来,OpenGL只在3维空间绘制,glVertex2f之类的函数,是默认z = 0的。那么如何实现二维图的缩放呢?先来介绍3个知识点。 1)OpenGL的坐标系:X轴从左向右是正方向,Y轴从下...
  • liji_digital
  • liji_digital
  • 2016年09月06日 22:56
  • 1805

OpenGL: 缩放变换

代码如下:#define GLUT_DISABLE_ATEXIT_HACK #include "gl/glut.h" #pragma comment(lib, "glut32.lib") int ...
  • Augusdi
  • Augusdi
  • 2014年03月05日 10:23
  • 6843

OpenGL图像缩放的不同插值类型

Translated from:https://www.codeproject.com/articles/236394/bi-cubic-and-bi-linear-interpolation-wit...
  • CDUT100
  • CDUT100
  • 2017年02月22日 19:36
  • 653

openGL ES JNI贴图 平移 旋转 缩放

采用demo为NDK sample下的hello-gl2。 1、修改gVertexShaderstatic const char gVertexShader[] = "uniform mat...
  • u013366022
  • u013366022
  • 2015年07月07日 20:05
  • 1471

[OpenGL] 桌子的平移、旋转和缩放

1)绘制立方体         考虑分别绘制六个面,先把每个正方形的坐标点存储在数组中,然后再利用循环完成绘制。(这样的绘制模式使一条边被绘制了两次,有一些优化的方法,为了逻辑更清晰没有进行优化)...
  • ZJU_fish1996
  • ZJU_fish1996
  • 2016年03月24日 22:20
  • 2269
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:opengl下缩放与拖动的问题记录
举报原因:
原因补充:

(最多只允许输入30个字)