?? glwidget.cpp
字號:
#include "glwidget.h"
#include <math.h>
#include "glut.h"
#define MAP 40// MAP_W*MAP_SCALE/2
GLWidget::GLWidget(QWidget* parent)
: QGLWidget( parent)
{
g_Angle=0;
g_elev=0;
g_eye[0]= -60;
g_eye[1]=15;
g_eye[2]=0;
g_look[0]=140;
g_look[1]=g_eye[1];
g_look[2]=0;
ang = 0;
line_count=0;
type=1;
}
GLWidget::~GLWidget()
{
}
void GLWidget::initializeGL()
{
glClearColor( 0.0, 0.0, 0.0, 0.0 );
glEnable(GL_DEPTH_TEST);
}
void GLWidget::resizeGL(int w, int h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)w/(GLfloat)h,0.1f,3000.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void GLWidget::paintGL()
{
glClearColor(0.0f, 0.0f, 0.3f, 1.0f);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
switch(type)
{
case 1:
gluLookAt(g_eye[0],g_eye[1],g_eye[2],60-40*cos(ang),g_look[1],40*sin(ang),0.0,1.0,0.0);
break;
case 2:
gluLookAt(g_eye[0]+15,g_eye[1]+15,g_eye[2]+15,60-40*cos(ang),g_look[1],40*sin(ang),0.0,1.0,0.0);
break;
case 3:
gluLookAt(100,18,150,90,18,10,0.0,1.0,0.0);
break;
case 4:
gluLookAt(-40,60,200,0,-5.0,0,0.0,1.0,0.0);
break;
default :
break;
}
glDisable( GL_LIGHTING );
glDisable( GL_TEXTURE_2D );
drawground();
drawroad();
drawobject();
}
void GLWidget::drawground()
{
glPushAttrib(GL_CURRENT_BIT);
glEnable(GL_BLEND);
glPushMatrix();
qglColor(gray);
glTranslatef(0,0.0f,0);
int size0=(int)(MAP*2);
glBegin(GL_LINES);
for (int x = -size0; x < size0;x+=4)
{glVertex3i(x, 0, -size0); glVertex3i(x, 0, size0);}
for (int z = -size0; z < size0;z+=4)
{glVertex3i(-size0, 0, z); glVertex3i( size0, 0, z);}
glEnd();
glPopMatrix();
glDisable(GL_BLEND);
glPopAttrib();
}
void GLWidget::drawroad()
{
glPushMatrix();
qglColor(darkGray);
glBegin(GL_LINE_STRIP);
int size0=(int)(MAP*2);
float r0=40;
const double pi = 3.14159264;
float angle;
glBegin(GL_LINES);
glVertex3f(20.0,40.0,0.0);
glVertex3f(-5.0,40.0,-200.0);
glEnd();
glBegin( GL_LINES );
for (int i=0;i<=80;)
{
angle = i *pi / 20;
glVertex3f( 60-r0*cos(angle), 40-angle*3, r0*sin(angle) );
angle = ++i *pi / 20;
glVertex3f( 60-r0*cos(angle), 40-angle*3, r0*sin(angle) );
}
glEnd();
glPopMatrix();
}
void GLWidget::drawobject()
{
glEnable( GL_CULL_FACE );
glEnable( GL_LIGHTING );
glEnable( GL_LIGHT0 );
glEnable( GL_DEPTH_TEST );
glPushMatrix();
if(line_count<200)
{
glTranslatef(-5.0+line_count/8,40.0,-200.0+line_count);
g_eye[0]=-20.0+line_count/8;
g_eye[1] = 65;
g_eye[2] = -300+line_count;
g_look[0] = -20.0+line_count/8;
g_look[1] = 25;
g_look[2] = -300+line_count;
}
else if(ang<12.6&&line_count==200)
{
glTranslatef(60-40*cos(ang),40-ang*3,40*sin(ang));
g_eye[0]=60+20*cos(ang);
g_eye[1] = 65;
g_eye[2] = 40*sin(ang);
g_look[0] = 60-40*cos(ang);
g_look[1] = 15;
g_look[2] = 40*sin(ang);
}
else
{
line_count=0;
ang=0;
}
glutSolidSphere(1.0,40,40);
glPopMatrix();
}
void GLWidget::animate()
{
if(line_count==200)
{
ang +=0.02;
}
else
{
line_count+=1;
}
updateGL();
}
void GLWidget::press(QKeyEvent *e)
{
if(e->key()==Key_1)
{
type = 1;
}
if(e->key()==Key_2)
{
type = 2;
}
if(e->key()==Key_3)
{
type = 3;
}
if(e->key()==Key_4)
{
type = 4;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -