OpenGL实现二维图的平移
来源:互联网 发布:淘宝投放手机详情 编辑:程序博客网 时间:2024/06/06 20:07
在前面的博客《OpenGL实现二维图的缩放》中,我提到了gluLookAt的作用是定义观察者的位置和视线方向。在本文中,我们正好利用这个功能来实现二维图的平移。
#ifndef WIDGET_H#define WIDGET_H#include <QGLWidget>#include <QWheelEvent>#include <QMouseEvent>class Widget : public QGLWidget{ Q_OBJECTpublic: explicit Widget(QWidget *parent = 0); ~Widget(); int m_iWidth; int m_iHeight; float m_fXOffset; float m_fYOffset; float m_fPrevXPos; float m_fPrevYPos; int m_iXPos; int m_iYPos; bool m_bMoved; int m_iMag;private:protected: virtual void initializeGL(); virtual void paintGL(); virtual void resizeGL(int, int); virtual void wheelEvent(QWheelEvent *); virtual void mouseMoveEvent(QMouseEvent *); virtual void mousePressEvent(QMouseEvent *); virtual void mouseReleaseEvent(QMouseEvent *);};#endif // WIDGET_H
#include "widget.h"#include <GL/glu.h>Widget::Widget(QWidget *parent) : QGLWidget(parent){ setMouseTracking(false); m_fPrevXPos = m_fPrevYPos = 0.0; m_fXOffset = m_fYOffset = 0.0; m_bMoved = false;}Widget::~Widget(){}void Widget::wheelEvent(QWheelEvent *e){ QPoint qpMag = e->angleDelta(); int iMag = qpMag.y(); bool bUpdate = false; if(iMag > 0) { if(m_iMag < 8) { m_iMag *= 2; bUpdate = true; } } if(iMag < 0) { if(m_iMag > 1) { m_iMag /= 2; bUpdate = true; } } if(bUpdate) { updateGL(); }}void Widget::initializeGL(){ glClearColor(0.0, 1.0, 1.0, 0); m_iMag = 1;}void Widget::resizeGL(int w, int h){ if(w > 0 && h >0) { glViewport(0, 0, (GLint)w, (GLint)h);//这句话把显示的范围跟glWindow范围划了等号 m_iWidth = w; m_iHeight = h; }}void Widget::paintGL(){ //clear放在初始化里面会造成闪烁 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(10.0 * m_iMag, m_iWidth / m_iHeight, -8.0, 8.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(m_fPrevXPos + m_fXOffset * 0.01, m_fPrevYPos + m_fYOffset * 0.01, 50.0, m_fPrevXPos + m_fXOffset * 0.01, m_fPrevYPos + m_fYOffset * 0.01, 0.0, 0.0, 1.0, 0.0); glBegin(GL_QUADS); glVertex2f(-0.5, -0.5); glVertex2f(0.5, -0.5); glVertex2f(0.5, 0.5); glVertex2f(-0.5, 0.5); glEnd();}void Widget::mouseMoveEvent(QMouseEvent *e){ if(m_bMoved) { m_fXOffset = m_iXPos - e->x(); m_fYOffset = e->y() - m_iYPos;//widget对Y方向的定义和opengl坐标系相反 updateGL(); }}void Widget::mouseReleaseEvent(QMouseEvent *e){ Q_UNUSED(e); m_fPrevXPos += m_fXOffset * 0.01; m_fPrevYPos += m_fYOffset * 0.01; m_fXOffset = m_fYOffset = 0.0; m_bMoved = false;}void Widget::mousePressEvent(QMouseEvent *e){ m_iXPos = e->x(); m_iYPos = e->y(); m_bMoved = true;}
运行程序,可见白色正方形随着鼠标拖动而移动
0 0
- OpenGL实现二维图的平移
- 二维图形学的变换-平移、旋转、缩放 OpenGL
- OpenGL实现二维图的缩放
- perl-opengl基本图形操作-缩放,二维旋转,二维平移
- OpenCV编程->二维图像的平移warpAffine
- OpenGL 旋转平移之后的坐标获取
- openGL 矩阵的旋转-平移-缩放
- [OpenGL] 桌子的平移、旋转和缩放
- [OpenGL] 茶壶的投影、旋转、平移
- OpenGL的glTranslatef平移变换函数详解
- VC++调用OpenGL实现3维图形的旋转,平移和缩放
- 计算机图形学Opengl实现二维图形的…
- 计算机图形学Opengl实现二维图形的…
- OPenGL在MFC框架中实现平移缩放
- OpenGL绘制简单场景,实现旋转缩放平移和灯光效果
- OpenGL实现鼠标绕任意轴旋转/平移/缩放
- OpenGL实现鼠标绕任意轴旋转/平移/缩放
- OpenGL实现鼠标绕任意轴旋转/平移/缩放
- location.herf 和 location.replace
- 百度传课 amazeUI 按钮交互 作业
- mina源码学习之IoSession
- *浙大PAT甲级 1114 并查集
- 汉诺塔系列1
- OpenGL实现二维图的平移
- Elasticsearch笔记六之中文分词器及自定义分词器
- hdu 5437优先队列
- 【工控机开发】‘close' was not declared in this scope
- WIN32 进程间通讯-共享内存
- java io流详解(二)对象输入输出流
- java例题学习:面向对象之员工类
- 美颜主要代码实现
- 程序包com.sun.image.codec.jpeg不存在 的解决办法