#include "glwidget.h"
#include "ui_glwidget.h"
GLWidget::GLWidget(QWidget *parent) :
QOpenGLWidget(parent),
ui(new Ui::GLWidget)
{
ui->setupUi(this);
funllscreen = false;
setGeometry(2000,50,950,950);
// showFullScreen(); //全屏显示
}
GLWidget::~GLWidget()
{
delete ui;
}
void GLWidget::initializeGL()
{
glShadeModel(GL_SMOOTH); //设置阴影平滑
glClearColor(0.0,0.0,0.0,0.0); //设置清除屏幕是所用的颜色
//必须有的
glClearDepth(1.0); //设置好缓冲深度
glEnable(GL_DEPTH_TEST); //启用深度测试
glEnable(GL_LINE_SMOOTH);
glDepthFunc(GL_LEQUAL); //所用深度测试类型
//真正的精度修正
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
static GLfloat the_translatef = -1.3;
void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深度缓冲
glLoadIdentity(); //重置当前观察模型矩阵 将当前点移到屏幕中心
//画坐标系
glTranslatef(0.0,0.0,the_translatef); //这个是个要命的东西,在这里,要理解视场的概念 gluPerspective(45.0,(GLfloat)w/(GLfloat)h,0.1,100.0); 这就是标志你的市场是在纵向 0.1-100之间,你眼前就是最近的,最远的就是负值
glBegin(GL_LINES);
glColor3f(0.0f,1.0f,0.0f);
glVertex2f(-0.5f,0.0f);
glVertex2f(0.5f,0.0f);
glEnd();
glBegin(GL_LINES);
glColor3f(0.0f,1.0f,0.0f);
glVertex2f(0.0f,-0.5f);
glVertex2f(0.0f,0.5f);
glEnd();
DrwaArc();
Drwaradar();
}
void GLWidget::resizeGL(int w, int h)
{
if(h == 0) //防止H为零,不知道为啥要设置
{
h =1;
}
glViewport(0,0,(GLint)w,(GLint)h); //重置当前窗口大小
glMatrixMode(GL_PROJECTION); //选择投影矩阵
glLoadIdentity(); //重置投影举证
gluPerspective(45.0,(GLfloat)w/(GLfloat)h,0.1,100.0); //建立透视矩阵
glMatrixMode(GL_MODELVIEW); //选择模型观察矩阵
glLoadIdentity(); //重置模型观察矩阵
}
void GLWidget::DrwaArc() //画圈圈
{
GLfloat pi =3.1415926;
GLfloat R = 0.01;
int n=1000;
glColor3f(0.0,1.0,0.0);
for(int k =0;k<10;k++)
{
R = 0.05+0.05*k;
glBegin(GL_LINE_LOOP);
for(int i =0;i<1000;i++)
{
glVertex2f(R*cos(2*pi/n*i),R*sin(2*pi/n*i));
}
glEnd();
}
}
static int i =3600;
void GLWidget::Drwaradar()
{
glEnable(GL_BLEND);
glRotatef((0.0+0.2*i),0.0f,0.0f,1.0f);
GLfloat pi =3.1415926;
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glBegin(GL_LINES);
GLfloat agent = 1.0;
for(float m=0;m<60;m=m+0.1) //雷达余晖算法
{
agent = 1.0-(m/60);
// if(agent<0.2)
// agent =0.2;
glColor4f(0.0,agent,0.0,1.0-(m/60));
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.5*cos(pi*((0.0+0.2*i)+m)/180.0),0.5*sin(pi*((0.0+0.2*i)+m)/180.0),0.0f);
}
glEnd();
glDisable(GL_BLEND);
if(i>0)
{
i--;
}
else
{
i=3600;
}
glColor3f(0.0,1.0,0.0);
GLfloat R = 0.01;
int n=1000;
glBegin(GL_POLYGON);
for(int i =0;i<n;i++)
{
glVertex2f(R*cos(2*pi/n*i),R*sin(2*pi/n*i));
}
glEnd();
update(); //时时更新
}
//放大缩小,现在只是改变视场的大小,还不确定是不是真正的确定
void GLWidget::wheelEvent(QWheelEvent *event)
{
if(event->angleDelta().ry()<0)
{
the_translatef = the_translatef - 0.03;
}
if(event->angleDelta().ry()>0)
{
the_translatef = the_translatef + 0.03;
}
}
- 1
- 2
前往页