⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 glwidget.cpp

📁 Qt平台下使用,C++语言所实现的,球体位置变化,并相应的视角跟踪以及变换.对于学习,OpenGL的glLookAt很有帮助.
💻 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 + -