如何绘制点、线、多边形?
一、几何图元
- GL_POINTS:点
- GL_LINES:线段,二个点确定线段
- GL_LINE_STRIP:第一个点依次连接的线段
- GL_LINE_LOOP:和GL_LINE_STRIP相同,但首尾连接,形成环状
- GL_POLYGON:多边形
- GL_QUADS:由四个点组成一个四边形
- GL_QUADS_STRIP:四边形带
- GL_TRIANGLES:三角形,三个点确定
- GL_TRIANGLE_STRIP:共用一个条带上的顶点的一组三角形
- GL_TRIANGLE_FAN:以一个原点为中心呈扇形排列,公共相邻顶点的一组三角形
二、点
step1:在“工程文件”中加入
QT += opengl
代码参考网址:https://blog.csdn.net/myths_0/article/details/24431597
(有代码,内容解释很详细。但我不可能每次都需要详细的过一遍,这里算是自己的简化版本笔记)
我的代码如下:
widget.h
//widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QGLWidget>
#include <GL/gl.h>
#include <GL/glu.h>
namespace Ui {
class Widget;
}
class Widget : public QGLWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
bool fullscreen,light;
GLfloat m_rtri; //控制三角形的角度
GLfloat m_rquad; //控制四边形的角度
int winWidth,winHeight;
GLbyte* colorArr;
float horizontal;
float vertical;
QPoint m_last;
protected:
void initializeGL();
void paintGL();
void resizeGL(int width,int height);
void keyPressEvent(QKeyEvent *event);
void mouseMoveEvent(QMouseEvent *e);
void mousePressEvent(QMouseEvent *e);
};
#endif // WIDGET_H
widget.cpp
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QKeyEvent>
#include <QTimer>
#include <iostream>
using namespace std;
Widget::Widget(QWidget *parent) :
QGLWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
fullscreen = false;
horizontal = 0.0;
vertical = 30.0;
m_rtri = 0.0f;
}
void Widget::initializeGL()
{
glShadeModel(GL_SMOOTH);//启用阴影平滑,阴影平滑通过多边形精细的混合色彩,并对外部光进行平滑。
glClearColor(0.0,0.0,0.0,0.0);//清除屏幕时所用的颜色
glClearDepth(1.0);//设置深度缓存
glEnable(GL_DEPTH_TEST);//启用深度测试
glDepthFunc(GL_LEQUAL);//所作深度测试的类型.上面3行做的是关于深度缓存的,深度缓存的排序决定哪个物体先画
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
}
void Widget::paintGL()//对OpenGL进行所有的设置。设置清除屏幕所用的颜色,打开深度缓存,启用smooth shading.等窗口创建之后才会被调用
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除屏幕和深度缓存
glLoadIdentity();//重置当前的模型观察矩阵。在glLoadIdentity()调用之后,函数返回之前,添加代码来创建基本的形
//目前所做的就是将屏幕清除成前面所决定的颜色,清除深度缓存并且重置场景,仍然没绘制任何东西。
glTranslatef(-1.5, 0.0, -6.0 );//移动的时候不是相对于屏幕中心移动,而是相对于当前所在屏幕位置
int M = 2;
int N = 2;
float **Zn = (float **)new float *[N];
for(int i=0;i<N;i++)
{
Zn[i] = new float[M];
}
glBegin(GL_POINTS);
glVertex3f(-1,-1,0);
glVertex3f(1,1,0);
glVertex3f(1,-1,0);
glVertex3f(-1,1,0);
glEnd();
}
void Widget::resizeGL(int width,int height)
{
if(height==0)//防止height为0
{
height=1;
}
glViewport(0,0,(GLint)width,(GLint)height);//重置当前的视口
glMatrixMode(GL_PROJECTION);//选择投影矩阵
glLoadIdentity();//重置投影矩阵
gluPerspective(45.0,(GLfloat)width/(GLfloat)height,0.1,100.0);//建立透视投影矩阵
glMatrixMode(GL_MODELVIEW);//选择模型观察矩阵
glLoadIdentity();//重置模型观察矩阵
}
void Widget::keyPressEvent(QKeyEvent *event)//加头文件#include <QKeyEvent>
{
GLint viewPort[4] = {0};
switch (event->key())
{
//F1为全屏和普通屏的切换键
case Qt::Key_F2:
fullscreen = !fullscreen;
if (fullscreen)
{
showFullScreen();
}
else
{
showNormal();
}
updateGL();
break;
//ESC为退出键
case Qt::Key_Escape:
close();
case Qt::Key_C:
m_rtri += 15.0f;
case Qt::Key_L:
light = !light;
if(!light){
glDisable(GL_LIGHTING);
}else{
glEnable(GL_LIGHTING);
}
}
}
void Widget::mousePressEvent(QMouseEvent *e)
{
m_last = e->pos();
}
Widget::~Widget()
{
delete ui;
}
运行结果如下: