学习OpenGL 相机
(1) 头文件
#ifndef COPENGLWIDGETHELLOCAMERA_H
#define COPENGLWIDGETHELLOCAMERA_H
/*
* 控件名称:Hello Camera
*
*
* 注意:1. STD C++ Version >= C++11
* 2. FPS相机
*
* Author: hsw
*
*/
#include <QPainter>
#include <QPaintEngine>
#include <QKeyEvent>
#include <QDebug>
#include <QCoreApplication>
#include <QOpenGLWidget> // OpenGLWidget
#include <QOpenGLFunctions> // OpenGL函数
#include <QOpenGLShaderProgram>
#include <QOpenGLShader>
#include <QOpenGLBuffer>
#include <QOpenGLTexture>
#include <QMatrix4x4>
#include <QTimer>
#include <QtMath>
class COpenGLWidgetHelloCamera : public QOpenGLWidget, public QOpenGLFunctions
{
public:
COpenGLWidgetHelloCamera(int mode = 0, QWidget* parent = 0);
~COpenGLWidgetHelloCamera();
protected:
void initializeGL() override;
void resizeGL(int width, int height) override;
void paintGL() override;
protected:
bool eventFilter(QObject *obj, QEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
void wheelEvent(QWheelEvent *event) override;
signals:
void m_openglCloseSgn();
private:
void m_paintCube(const QVector3D &position, const int posIndex, const QMatrix4x4 &qView);
private:
QWidget* m_pParent;
private:
// OpenGL
QOpenGLShader* m_pVShader; // 顶点着色器
QOpenGLShader* m_pFShader; // 片段着色器
QOpenGLShaderProgram* m_pShaderProgram; // 管理着色器
QOpenGLBuffer m_vBufferObject; // 顶点的缓冲对象
QOpenGLTexture* m_pTexture; // 纹理对象
QOpenGLTexture* m_pTexture2; //
int m_vertexAttr; // 顶点位置数据对象
int m_colorAttr; // 顶点颜色数据对象
int m_textureAttr; // 纹理数据对象
int m_mode; // 着色器中传入颜色的模式:= 0, 旋转相机
QTimer m_timer; // 计时器
// 相机的参数
QVector3D m_cameraPos;
QVector3D m_cameraFront;
QVector3D m_cameraUp;
QVector3D m_cameraRight;
float m_pitch;
float m_yaw;
float m_fov;
// 鼠标的参数
QPointF m_mousePressPos;
QPointF m_mouseMovePos;
QPointF m_mouseReleasePos;
};
#endif // COPENGLWIDGETHELLOCAMERA_H
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "copenglwidgethellocamera.h"
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
COpenGLWidgetHelloCamera* m_pRSOpenGLWidgetHelloCamera;
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
(2) CPP文件
#include "copenglwidgethellocamera.h"
COpenGLWidgetHelloCamera::COpenGLWidgetHelloCamera(int mode, QWidget *parent) : QOpenGLWidget(parent)
{
m_pParent = parent;
QSurfaceFormat format;
format.setDepthBufferSize(24);
format.setStencilBufferSize(8);
QSurfaceFormat