先上代码,由于程序结构很清楚,上节也讲到了Qt中实现OpenGL的框架,因此代码读起来没有太大困难,如果有问题,欢迎私信~
MyGLWidget:
#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H
#include <QGLWidget>
class MyGLWidget : public QGLWidget
{
Q_OBJECT
public:
MyGLWidget(QWidget *parent = 0);
~MyGLWidget();
void setData(QVector<double> , QVector<double>, QVector<double>);
protected:
void initializeGL();
void paintGL();
void resizeGL(int width, int height);
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void keyPressEvent(QKeyEvent *event);
void wheelEvent(QWheelEvent *event);
public slots:
void setXRotation(int angle);
void setYRotation(int angle);
void setZRotation(int angle);
void setXtran(double x);
void setYtran(double x);
void setScale(double x);
signals:
void xRotationChanged(int angle);
void yRotationChanged(int angle);
void zRotationChanged(int angle);
private:
double xRot, yRot, zRot;
double xtran, ytran;
double scal;
double dMax;
QVector<double> dx, dy, dz, r, g, b;
int dSize;
QPoint lastPos;
};
#endif // MYGLWIDGET_H
#include <QtOpenGL>
#include "myglwidget.h"
MyGLWidget::MyGLWidget(QWidget *parent) : QGLWidget(parent)
{
dMax=0;
xRot =0; yRot =0; zRot =0;
xtran=0; ytran=0;
scal=1;
QVector<double> rl(7), gl(7), bl(7);
rl[0]=1.0; rl[1]=1.0; rl[2]=1.0; rl[3]=0.0; rl[4]=0.0; rl[5]=0.0; rl[6]=1.0;
gl[0]=0.0; gl[1]=0.5; gl[2]=1.0; gl[3]=1.0; gl[4]=0.0; gl[5]=1.0; gl[6]=0.0;
bl[0]=0.0; bl[1]=0.0; bl[2]=0.0; bl[3]=0.0; bl[4]=1.0; bl[5]=1.0; bl[6]=1.0;
r=rl; g=gl; b=bl;
}
MyGLWidget::~MyGLWidget(){}
void MyGLWidget::setData(QVector<double> x, QVector<double> y, QVector<double> z)
{
dSize=x.size(); dx=x; dy=y; dz=z;
for (int i=0;i<dSize;i++)
{
dMax=qMax(dMax,dx.at(i));
dMax=qMax(dMax,dy.at(i));
dMax=qMax(dMax,dz.at(i));
}
}
void MyGLWidget::initializeGL()
{
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glShadeModel(GL_SMOOTH);
}
void MyGLWidget::resizeGL(int width, int height)
{
int border=qMax(width,height);
glViewport((width-border)/2, (height-border)/2, border, border);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-dMax*1.5, +dMax*1.5, -dMax*1.5, +dMax*1.5, -dMax*10.0, dMax*10.0);
glMatrixMode(GL_MODELVIEW);
}
void MyGLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glScalef(scal,scal,scal);
glTranslatef(xtran, ytran, 0);
glRotatef(xRot / 16.0, 1.0, 0.0, 0.0);
glRotatef(yRot / 16.0, 0.0, 1.0, 0.