• opengl 光照


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

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

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

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

      1 #include <windows.h>
      2 #include <GL/glut.h>
      3 #include <GL/glext.h>
      4 #include <GL/SOIL.h>
      5 #include <cstdio>
      6 GLfloat r1 = 0.0f;
      7 GLfloat r2 = 0.0f;
      8 GLfloat r3 = 0.0f;
      9 GLfloat rlight1 = 0.0f;
     10 
     11 GLfloat mat_specular[] = {1.0f,1.0f,1.0f,1.0f};
     12 GLfloat low_shiniess[] = {5.0};      // 镜面反射
     13 
     14 GLfloat material1[] = {1.0f,0.0f,0.0f,1.0f};
     15 GLfloat material2[] = {0.0f,1.0f,0.0f,1.0f};
     16 GLfloat material3[] = {0.0f,0.0f,1.0f,1.0f};
     17 
     18 
     19 GLfloat light_position1[] = {0.0f,0.0f,4.0f,1.0f};
     20 GLfloat light_diffuse1[] = {1.0f,1.0f,1.0f,1.0f};   //白光
     21 
     22 GLfloat light_position2[] = {1.0f,-2.0f,1.0f,1.0f}; //红光
     23 GLfloat light_diffuse2[] = {1.0f,0.0f,0.0f,1.0f};
     24 
     25 GLfloat light_position3[] = {0.0f,0.0f,2.0f,1.0f};
     26 GLfloat light_diffuse3[] = {0.0f,0.0f,1.0f,1.0f};// 蓝光
     27 GLfloat light_specular3[] = {1.0f,1.0f,1.0f,1.0f};
     28 //漫射光
     29 void  init ()
     30 {
     31     glShadeModel(GL_SMOOTH);
     32     glClearColor(0.0,0.0,0.0,0.0);
     33     glClearDepth(1.0);
     34     glEnable(GL_DEPTH_TEST);
     35     glDepthFunc(GL_LEQUAL);
     36     glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
     37     glEnable(GL_LIGHTING);
     38     //glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
     39     //glMaterialfv(GL_FRONT,GL_SHININESS,low_shiniess);
     40 }
     41 
     42 void reshape(int w,int h)
     43 {
     44     glViewport(0,0,(GLsizei)w,(GLsizei)h);
     45     glMatrixMode(GL_PROJECTION);
     46     glLoadIdentity();
     47     gluPerspective(45.0,(GLfloat)w/(GLfloat)h,0.1,100.0);
     48     glMatrixMode(GL_MODELVIEW);
     49     glLoadIdentity();
     50     gluLookAt(0.0f,0.0f,10.0f,
     51               0.0f,0.0f,0.0f,
     52               0.0f,1.0f,0.0f);
     53 
     54 
     55 }
     56 void display()
     57 {
     58     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     59     glPushMatrix();
     60         glRotated(rlight1,0.0f,1.0f,0.0f);
     61         glLightfv(GL_LIGHT0,GL_POSITION,light_position1);
     62         glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse1);  //世界坐标系光源
     63     glPopMatrix();
     64 
     65     glPushMatrix();
     66         glDisable(GL_LIGHTING);
     67         glRotated(rlight1,0.0f,1.0f,0.0f);
     68         glTranslatef(0.0f,0.0f,4.0f);
     69         glColor3f(1.0f,1.0f,1.0f);         //光源1 白光 的小球
     70         glutSolidSphere(0.05,10,10);
     71         glEnable(GL_LIGHTING);
     72     glPopMatrix();
     73 
     74     glLightfv(GL_LIGHT1,GL_POSITION,light_position2);
     75     glLightfv(GL_LIGHT1,GL_DIFFUSE,light_diffuse2);    //观察坐标系光源
     76 
     77     glPushMatrix();
     78         glDisable(GL_LIGHTING);
     79         glTranslatef(1.0f,-2.0f,1.0f);   //光源2  红光的小球
     80         glColor3f(1.0f,0.0f,0.0f);
     81         glutSolidSphere(0.05,10,10);
     82         glEnable(GL_LIGHTING);
     83     glPopMatrix();
     84 
     85 
     86 
     87     //teapot1
     88     glPushMatrix();
     89         glTranslatef(0.0f,2.0f,0.0f);
     90         glRotatef(r1,0.0f,1.0f,0.0f);
     91         //glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,material1);
     92         glLightfv(GL_LIGHT2,GL_POSITION,light_position3);
     93         glLightfv(GL_LIGHT2,GL_DIFFUSE,light_diffuse3);
     94         glLightfv(GL_LIGHT2,GL_SPECULAR,light_specular3);  //
     95         glLightf(GL_LIGHT2,GL_SPOT_CUTOFF,45.0f);
     96         glPushMatrix();
     97             glDisable(GL_LIGHTING);
     98             glTranslated(0.0f,0.0f,2.0f);
     99             glRotatef(r1,0.0f,1.0f,0.0f);
    100             glColor3f(0.0f,0.0f,1.0f);     //蓝色光源的小球
    101             glutSolidSphere(0.05,10,10);
    102             glEnable(GL_LIGHTING);
    103         glPopMatrix();
    104         glutSolidTeapot(1.0f);
    105     glPopMatrix();
    106 
    107 
    108 
    109     //teapot2
    110     glPushMatrix();
    111         glTranslatef(-2.5f,-1.0f,0.0f);
    112         glRotatef(r2,1.0f,0.0f,0.0f);
    113         //glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,material2);
    114         //glColor3f(1.0f,0.0f,0.0f);
    115         glutSolidTeapot(1.0f);
    116     glPopMatrix();
    117 
    118     //teapot3
    119     glPushMatrix();
    120         glTranslatef(2.5f,-1.0f,0.0f);
    121         glRotatef(r3,0.0f,0.0f,1.0f);
    122         //glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,material3);
    123         //glColor3f(1.0f,1.0f,0.0f);
    124         glutSolidTeapot(1.0f);
    125     glPopMatrix();
    126 
    127     glFlush();
    128 }
    129 void mouse_move1(int x,int y)
    130 {
    131     r1+=10.0f;
    132     glutPostRedisplay();
    133 }
    134 void mouse_move2(int x,int y)
    135 {
    136     r2+=10.0f;
    137     glutPostRedisplay();
    138 }
    139 void mouse_move3(int x,int y)
    140 {
    141     r3+=10.0f;
    142     glutPostRedisplay();
    143 }
    144 void rotate1()
    145 {
    146     rlight1+=1.0f;
    147     if(rlight1>360.0)
    148         rlight1 = rlight1-360;
    149     glutPostRedisplay();
    150 }
    151 void keyboard(unsigned char key,int x,int y)
    152 {
    153     switch(key)
    154     {
    155     case '1':
    156         glutMotionFunc(mouse_move1);
    157         break;
    158     case '2':
    159         glutMotionFunc(mouse_move2);
    160         break;
    161     case '3':
    162         glutMotionFunc(mouse_move3);
    163         break;
    164     case 'r':
    165         glutIdleFunc(rotate1);
    166         break;
    167     case 's':
    168         glutIdleFunc(NULL);
    169         break;
    170     case 'a':        // light1
    171         glDisable(GL_LIGHT1);
    172         glDisable(GL_LIGHT2);
    173         glEnable(GL_LIGHT0);
    174         glutPostRedisplay();
    175         break;
    176      case 'b':       //light2
    177         glDisable(GL_LIGHT0);
    178         glDisable(GL_LIGHT2);
    179         glEnable(GL_LIGHT1);
    180         glutPostRedisplay();
    181         break;
    182      case 'c':      //light2
    183         glDisable(GL_LIGHT1);
    184         glDisable(GL_LIGHT0);
    185         glEnable(GL_LIGHT2);
    186         glutPostRedisplay();
    187         break;
    188     }
    189 }
    190 
    191 /*void mouse(int button,int state,int x,int y)
    192 {
    193     switch(button){
    194     case GLUT_LEFT_BUTTON:
    195         if(state == GLUT_DOWN)
    196         break;
    197     case GLUT_RIGHT_BUTTON:
    198         if(state == GLUT_DOWN)
    199         break;
    200     }
    201 }*/
    202 int main(int argc,char **argv)
    203 {
    204     printf("keyboard 1,2,3 choose the teapot   mousemove control\n");
    205     printf("keyboard r light1 rotated, s stop");
    206     glutInit(&argc,argv);
    207     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    208     glutInitWindowSize(900,600);
    209     glutInitWindowPosition(400,100);
    210     glutCreateWindow("hello world");
    211     init();
    212     glutDisplayFunc(display);
    213     glutReshapeFunc(reshape);
    214     glutKeyboardFunc(keyboard);
    215     //glutMouseFunc(mouse);
    216     glutMainLoop();
    217     return 0;
    218 }

     

  • 相关阅读:
    读取大文件,一次读5兆
    手机+电脑如何使用油猴插件和油猴脚本?
    perl module 安装
    docker Ubuntu 环境变量
    vue中怎么利用express启动数据服务
    Oracle 两表关联更新
    linux 中 利用awk数组求每列的和及平均值
    linux 中shell数组的应用
    linux 中如何求每列的和及平均值
    linux 中如何删除文件末尾的空行
  • 原文地址:https://www.cnblogs.com/xibaohe/p/3061544.html
Copyright © 2020-2023  润新知