OpenG: 光照

来源:互联网 发布:猎户座计划 知乎 编辑:程序博客网 时间:2024/06/07 10:30

1.绘制带有光照效果的场景;
2.场景包含3个茶壶,通过键盘1,2,3可以分别选中三个茶壶,然后用鼠标对每个茶壶进行分别的旋转;
3.使用点光源,点光源为白色,以白色的球体表示;
4.使用3个不同的点光源

           i.      光源1的坐标设置在世界坐标系中,并围绕着三个茶壶的中心进行圆周运动;

           ii.     光源2 的坐标 设置在观察坐标系,不发生变化;

           iii.    光源3的坐标设置在茶壶1的物体坐标系中,当茶壶1被选中进行旋转时,光源3要跟随茶壶1 做相同的旋转;

#include <windows.h>#include <GL/glut.h>#include <GL/glext.h>#include <GL/SOIL.h>#include <cstdio>GLfloat r1 = 0.0f;GLfloat r2 = 0.0f;GLfloat r3 = 0.0f;GLfloat rlight1 = 0.0f;GLfloat mat_specular[] = {1.0f,1.0f,1.0f,1.0f};GLfloat low_shiniess[] = {5.0};      // 镜面反射GLfloat material1[] = {1.0f,0.0f,0.0f,1.0f};GLfloat material2[] = {0.0f,1.0f,0.0f,1.0f};GLfloat material3[] = {0.0f,0.0f,1.0f,1.0f};GLfloat light_position1[] = {0.0f,0.0f,4.0f,1.0f};GLfloat light_diffuse1[] = {1.0f,1.0f,1.0f,1.0f};   //白光GLfloat light_position2[] = {1.0f,-2.0f,1.0f,1.0f}; //红光GLfloat light_diffuse2[] = {1.0f,0.0f,0.0f,1.0f};GLfloat light_position3[] = {0.0f,0.0f,2.0f,1.0f};GLfloat light_diffuse3[] = {0.0f,0.0f,1.0f,1.0f};// 蓝光GLfloat light_specular3[] = {1.0f,1.0f,1.0f,1.0f};//漫射光void  init (){    glShadeModel(GL_SMOOTH);    glClearColor(0.0,0.0,0.0,0.0);    glClearDepth(1.0);    glEnable(GL_DEPTH_TEST);    glDepthFunc(GL_LEQUAL);    glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);    glEnable(GL_LIGHTING);    //glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);    //glMaterialfv(GL_FRONT,GL_SHININESS,low_shiniess);}void reshape(int w,int h){    glViewport(0,0,(GLsizei)w,(GLsizei)h);    glMatrixMode(GL_PROJECTION);    glLoadIdentity();    gluPerspective(45.0,(GLfloat)w/(GLfloat)h,0.1,100.0);    glMatrixMode(GL_MODELVIEW);    glLoadIdentity();    gluLookAt(0.0f,0.0f,10.0f,              0.0f,0.0f,0.0f,              0.0f,1.0f,0.0f);}void display(){    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    glPushMatrix();        glRotated(rlight1,0.0f,1.0f,0.0f);        glLightfv(GL_LIGHT0,GL_POSITION,light_position1);        glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse1);  //世界坐标系光源    glPopMatrix();    glPushMatrix();        glDisable(GL_LIGHTING);        glRotated(rlight1,0.0f,1.0f,0.0f);        glTranslatef(0.0f,0.0f,4.0f);        glColor3f(1.0f,1.0f,1.0f);         //光源1 白光 的小球        glutSolidSphere(0.05,10,10);        glEnable(GL_LIGHTING);    glPopMatrix();    glLightfv(GL_LIGHT1,GL_POSITION,light_position2);    glLightfv(GL_LIGHT1,GL_DIFFUSE,light_diffuse2);    //观察坐标系光源    glPushMatrix();        glDisable(GL_LIGHTING);        glTranslatef(1.0f,-2.0f,1.0f);   //光源2  红光的小球        glColor3f(1.0f,0.0f,0.0f);        glutSolidSphere(0.05,10,10);        glEnable(GL_LIGHTING);    glPopMatrix();    //teapot1    glPushMatrix();        glTranslatef(0.0f,2.0f,0.0f);        glRotatef(r1,0.0f,1.0f,0.0f);        //glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,material1);        glLightfv(GL_LIGHT2,GL_POSITION,light_position3);        glLightfv(GL_LIGHT2,GL_DIFFUSE,light_diffuse3);        glLightfv(GL_LIGHT2,GL_SPECULAR,light_specular3);  //        glLightf(GL_LIGHT2,GL_SPOT_CUTOFF,45.0f);        glPushMatrix();            glDisable(GL_LIGHTING);            glTranslated(0.0f,0.0f,2.0f);            glRotatef(r1,0.0f,1.0f,0.0f);            glColor3f(0.0f,0.0f,1.0f);     //蓝色光源的小球            glutSolidSphere(0.05,10,10);            glEnable(GL_LIGHTING);        glPopMatrix();        glutSolidTeapot(1.0f);    glPopMatrix();    //teapot2    glPushMatrix();        glTranslatef(-2.5f,-1.0f,0.0f);        glRotatef(r2,1.0f,0.0f,0.0f);        //glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,material2);        //glColor3f(1.0f,0.0f,0.0f);        glutSolidTeapot(1.0f);    glPopMatrix();    //teapot3    glPushMatrix();        glTranslatef(2.5f,-1.0f,0.0f);        glRotatef(r3,0.0f,0.0f,1.0f);        //glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,material3);        //glColor3f(1.0f,1.0f,0.0f);        glutSolidTeapot(1.0f);    glPopMatrix();    glFlush();}void mouse_move1(int x,int y){    r1+=10.0f;    glutPostRedisplay();}void mouse_move2(int x,int y){    r2+=10.0f;    glutPostRedisplay();}void mouse_move3(int x,int y){    r3+=10.0f;    glutPostRedisplay();}void rotate1(){    rlight1+=1.0f;    if(rlight1>360.0)        rlight1 = rlight1-360;    glutPostRedisplay();}void keyboard(unsigned char key,int x,int y){    switch(key)    {    case '1':        glutMotionFunc(mouse_move1);        break;    case '2':        glutMotionFunc(mouse_move2);        break;    case '3':        glutMotionFunc(mouse_move3);        break;    case 'r':        glutIdleFunc(rotate1);        break;    case 's':        glutIdleFunc(NULL);        break;    case 'a':        // light1        glDisable(GL_LIGHT1);        glDisable(GL_LIGHT2);        glEnable(GL_LIGHT0);        glutPostRedisplay();        break;     case 'b':       //light2        glDisable(GL_LIGHT0);        glDisable(GL_LIGHT2);        glEnable(GL_LIGHT1);        glutPostRedisplay();        break;     case 'c':      //light2        glDisable(GL_LIGHT1);        glDisable(GL_LIGHT0);        glEnable(GL_LIGHT2);        glutPostRedisplay();        break;    }}/*void mouse(int button,int state,int x,int y){    switch(button){    case GLUT_LEFT_BUTTON:        if(state == GLUT_DOWN)        break;    case GLUT_RIGHT_BUTTON:        if(state == GLUT_DOWN)        break;    }}*/int main(int argc,char **argv){    printf("keyboard 1,2,3 choose the teapot   mousemove control\n");    printf("keyboard r light1 rotated, s stop");    glutInit(&argc,argv);    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);    glutInitWindowSize(900,600);    glutInitWindowPosition(400,100);    glutCreateWindow("hello world");    init();    glutDisplayFunc(display);    glutReshapeFunc(reshape);    glutKeyboardFunc(keyboard);    //glutMouseFunc(mouse);    glutMainLoop();    return 0;}


 

 

http://www.cnblogs.com/xibaohe/archive/2013/05/05/3061544.html

0 0