Open Graphics Library初步_摄影机_GLUT

直接把代码弄进来,课上如果能讲到的话……

View Code
#include <gl/glut.h>
#include <math.h>

const float PI = 3.1416;
float ax = 0.0f;
float ay = 0.0f;
float az = 0.0f;
double et1 = 0.0;
double et2 = 0.0;
double d = 500.0;

int mx = 0;
int my = 0;

void Drawing_Box(){

glPushMatrix();
glPolygonMode(GL_BACK,GL_LINE);
glTranslatef(0.0f, 0.0f, 100.0f);
glRotatef(ax, 1.0f, 0.0f, 0.0f);
glRotatef(ay, 0.0f, 1.0f, 0.0f);
glRotatef(az, 0.0f, 0.0f, 1.0f);

glColor3f( 1.0f, 0.0f, 0.0f );
// 正方体
glutSolidCube(100);

/*
glBegin( GL_QUADS );
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(100.0f,100.0f,-100.0f);
glVertex3f(-100.0f,100.0f,-100.0f);
glVertex3f(-100.0f,-100.0f,-100.0f);
glVertex3f(100.0f,-100.0f,-100.0f);

glColor3f(0.0f,1.0f,0.0f);
glVertex3f(100.0f,-100.0f,100.0f);
glVertex3f(-100.0f,-100.0f,100.0f);
glVertex3f(-100.0f,100.0f,100.0f);
glVertex3f(100.0f,100.0f,100.0f);
glEnd();
*/
glPopMatrix();

// 地面
glPushMatrix();
glBegin( GL_QUADS );
glColor3f( 1.0f, 1.0f, 1.0f );
glVertex3f(100.0f,100.0f,0.0f);
glVertex3f(-100.0f,100.0f,0.0f);
glVertex3f(-100.0f,-100.0f,0.0f);
glColor3f( 0.5f, 0.5f, 1.0f );
glVertex3f(100.0f,-100.0f,0.0f);
glEnd();
glPopMatrix();
}

void Drawing(){
glPushMatrix();
glTranslatef(0.0f, 0.0f, 0.0f);
glRotatef(ax, 1.0f, 0.0f, 0.0f);
glRotatef(ay, 0.0f, 1.0f, 0.0f);
glRotatef(az, 0.0f, 0.0f, 1.0f);
glBegin( GL_LINES );{
for(float t=.0f; t<=PI; t+=.1f){
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(cosf(t)*100.0f,sinf(t)*100.0f,0.0f);
glVertex3f(0,0,0);

glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.0f,cosf(t)*100.0f,sinf(t)*100.0f);
glVertex3f(0,0,0);

glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(sinf(t)*100.0f,0.0f,cosf(t)*100.0f);
glVertex3f(0,0,0);
}
}glEnd();
glPopMatrix();
}

void SetEye()
{
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
double eyex;
double eyey;
double eyez;
double upx;
double upy;
double et2b = 90.0 - et2;
double et1b = -et1;
eyex = d * sin(et2b) * cos(et1b);
eyey = d * sin(et2b) * sin(et1b);
double temp = cos(et2b);
eyez = d * temp;

upx = - eyex * (eyez>0?1:-1);
upy = eyey / upx * eyex;
gluLookAt(eyex,eyey,eyez, 0,0,0, upx,upy,0);
}

void OnReshape(int w, int h){

double ar = (double)w/(double)h;
glViewport(0, 0, w, h);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();

/*
if(w>=h){
glOrtho(-300*ar, 300*ar, -300, 300, 0, 600);
}else{
glOrtho(-300, 300, -300/ar, 300/ar, 0, 600);
}

*/

gluPerspective( 60.0f, ar, 1, 800 );
/*
if(w>=h){
glFrustum(-ar*50.0f, ar*50.0f, -50.0f, 50.0f, 50, 800);
}else{
glFrustum(-50.0f, 50.0f, -50.0f/ar, 50.0f/ar, 50, 800);
}
*/

glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
gluLookAt(200,-400,500, 0,0,100, -1,2,0);

GLfloat ambientLight[] = {.3f, .3f, .3f, 1.0f};
GLfloat diffuseLight[] = {.7f, .7f, .7f, 1.0f};
glEnable(GL_DEPTH_TEST);
glFrontFace(GL_CCW);
glEnable(GL_CULL_FACE);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
glEnable(GL_NORMALIZE);
}

void OnDisplay(){
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
SetEye();
Drawing_Box();
glutSwapBuffers();
}

void OnTimer(int flag){
ax += 0.42f;
ay += 0.5f;
az += 0.1f;
//et1 += 0.005f;
//et2 = PI / 3;
OnDisplay();
glutTimerFunc(10, OnTimer, 101);
}

void OnMouse(int button, int state, int x, int y){
if(button == GLUT_DOWN){
mx = x;
my = y;
}
}

void OnMotion(int x, int y){
et1 += (double)(x - mx)/100.0;
et2 += (double)(y - my)/100.0;
mx = x;
my = y;
}

int main(int argc, char* argv[]){
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
glutInitWindowPosition(0,0);
glutInitWindowSize(800,600);
glutCreateWindow("窗口标题");
glutDisplayFunc(OnDisplay);
glutReshapeFunc(OnReshape);
glutTimerFunc(10, OnTimer, 101);
glutMouseFunc(OnMouse);
glutMotionFunc(OnMotion);
glutMainLoop();
return 0;
}



原文地址:https://www.cnblogs.com/cheetahw/p/2251996.html