• OpenGL三维与光照


      1 #include<windows.h>
      2 #include<gl/glut.h>
      3 #include<gl/gl.h>
      4 #include<gl/glu.h>
      5 
      6 //参数指定正方形的位置和大小
      7 GLfloat x1=100.0f;
      8 GLfloat y1=150.0f;
      9 GLsizei rsize=50;
     10 
     11 //正方形运动变化的步长
     12 GLfloat xstep=1.0f;
     13 GLfloat ystep=1.0f;
     14 
     15 //窗口的大小
     16 GLfloat windowWidth;
     17 GLfloat windowHeight;
     18 
     19 //画的物体
     20 void DrawDUA();
     21 void DrawTR();
     22 
     23 //属性开关
     24 void SunShine(void);//光照
     25 
     26 //三维
     27 GLfloat rtri;
     28 GLfloat rquad;
     29 
     30 //开关
     31 BOOL Draw3D=true;//三维动画演示开关
     32 BOOL Draw2D=false;//二维动画演示开关
     33 BOOL DrawAtoms=false;//原子动画演示开关
     34 
     35 
     36                     //三维属性开关
     37                     BOOL AS=true;//透视投影开关
     38                     BOOL OR=false;//正交平行投影
     39                     BOOL LIGHT=true;//光照开关
     40 
     41 
     42 
     43 void RenderScene(void)
     44 {
     45     if(Draw3D)
     46     {
     47         glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
     48         glMatrixMode(GL_MODELVIEW);
     49         glLoadIdentity();
     50         if(LIGHT)
     51             SunShine();
     52 
     53         glTranslatef(-1.5f,0.0f,-6.0f);
     54         glRotatef(rtri,0.0f,1.0f,0.0f);
     55 
     56         DrawTR();
     57 
     58         glLoadIdentity();
     59         glTranslatef(1.5f,0.0f,-6.0f);
     60         glRotatef(rquad,1.0f,0.0f,0.0f);
     61         glColor3f(0.5f,0.5f,1.0f);
     62 
     63 
     64         DrawDUA();
     65 
     66         rtri+=1.0f;
     67         rquad-=0.5f;
     68     }
     69 
     70     if(Draw2D)
     71     {
     72         glClear(GL_COLOR_BUFFER_BIT);
     73         glColor3f(1.0f,0.0f,0.0f);
     74         glRectf(x1,y1,x1+rsize,y1+rsize);
     75     }
     76 
     77     if(DrawAtoms)
     78     {
     79         //绕核旋转角度
     80         static float fElect1=0.0f;
     81 
     82         glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
     83 
     84         //重置模型视图矩阵
     85         glMatrixMode(GL_MODELVIEW);
     86         glLoadIdentity();
     87         if(LIGHT)
     88             SunShine();
     89 
     90         //将图形沿Z轴负向移动
     91         glTranslatef(0.0f,0.0f,-250.0f);
     92 
     93         //绘制红色原子核
     94         glColor3f(1.0f,0.0f,0.0f);
     95         glutWireSphere(10.0f,15,15);
     96 
     97         //绘制颜色变成绿色
     98         glColor3f(0.0f,1.0f,0.0f);
     99 
    100         //绘制第一个电子
    101         //保存当前的模型视图矩阵
    102         glPushMatrix();
    103         glRotatef(fElect1,0.0f,1.0f,0.0f);//绕y轴旋转一定角度
    104         glTranslatef(90.0f,0.0f,0.0f);//平移一段距离
    105         glutSolidSphere(6.0f,15,15);//画出电子
    106 
    107         //恢复矩阵
    108         glPopMatrix();
    109         glColor3f(0.0f,0.0f,1.0f);//绘制颜色变成蓝色
    110         //第二个电子
    111         glPushMatrix();
    112         glRotatef(45.0f,0.0f,0.0f,1.0f);
    113         glRotatef(fElect1,0.0f,1.0f,0.0f);
    114         glTranslatef(-70.0f,0.0f,0.0f);
    115         glutSolidSphere(6.0f,15,15);
    116         glPopMatrix();
    117 
    118         glColor3f(1.0f,1.0f,0.0f);//绘制颜色变成黄色
    119         //第三个电子
    120         glPushMatrix();
    121         glRotatef(-45.0f,0.0f,0.0f,1.0f);
    122         glRotatef(fElect1,0.0f,1.0f,0.0f);
    123         glTranslatef(0.0f,0.0f,60.0f);
    124         glutSolidSphere(6.0f,15,15);
    125         glPopMatrix();
    126         fElect1+=10.0f;
    127         if(fElect1>360.0f)
    128             fElect1=10.0f;
    129     }
    130     glutSwapBuffers();
    131 }
    132 
    133 void ChangeSize(GLsizei w,GLsizei h)
    134 {
    135     if(h==0)
    136         h==1;
    137 
    138     //设置视区尺寸
    139     glViewport(0,0,w,h);
    140     glMatrixMode(GL_PROJECTION);
    141     glLoadIdentity();
    142 
    143     if(Draw3D||DrawAtoms)
    144     {
    145         //修剪空间(透视投影)
    146         if(AS)
    147         {
    148             GLfloat fAspect;
    149             fAspect =(float)w/(float)h;
    150             gluPerspective(45.0,fAspect,1.0,500.0);
    151         }
    152 
    153 
    154 
    155         //(正交平行投影)
    156         if(OR)
    157         {
    158             if(w<=h)
    159                 glOrtho(-2.25,2.25,-2.25*h/w,2.25*h/w,-10.0,10.0);
    160             else
    161                 glOrtho(-2.25*h/w,2.25*h/w,-2.25,2.25,-10.0,10.0);
    162         }
    163 
    164 
    165 
    166     }
    167 
    168     if(Draw2D)
    169     {
    170         if(w<=h)
    171         {
    172             windowHeight=250.0f*h/w;
    173             windowWidth=250.0f;
    174         }
    175         else
    176         {
    177             windowWidth=250.0f*w/h;
    178             windowHeight=250.0f;
    179         }
    180 
    181         glOrtho(0.0f,windowWidth,0.0f,windowHeight,1.0f,-1.0f);
    182     }
    183 
    184     glMatrixMode(GL_MODELVIEW);
    185     glLoadIdentity();
    186 }
    187 
    188 void TimerFunction(int value)
    189 {
    190     if(x1>windowWidth-rsize||x1<0)
    191         xstep=-xstep;
    192     if(y1>windowHeight-rsize||y1<0)
    193         ystep=-ystep;
    194 
    195     x1+=xstep;
    196     y1+=ystep;
    197 
    198     glutPostRedisplay();
    199     glutTimerFunc(5,TimerFunction,1);
    200 }
    201 
    202 void SetupRC(void)
    203 {
    204     if(Draw3D||DrawAtoms)
    205     {
    206         glEnable(GL_DEPTH_TEST);//启用深度测试
    207         glFrontFace(GL_CCW);
    208     }
    209     glClearColor(0.0f,0.0f,1.0f,1.0f);
    210 }
    211 void TimerFunc(int value)
    212 {
    213     glutPostRedisplay();
    214     if(Draw3D)
    215     {
    216         glutTimerFunc(1,TimerFunc,1);
    217     }
    218     if(DrawAtoms)
    219     {
    220         glutTimerFunc(100,TimerFunc,1);
    221     }
    222 
    223 }
    224 int main(int argc,char* argv[])
    225 {
    226     if(Draw2D)
    227     {
    228         glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
    229         glutCreateWindow("Bounce");
    230         glutDisplayFunc(RenderScene);
    231         glutReshapeFunc(ChangeSize);
    232         glutTimerFunc(5,TimerFunction,1);
    233     }
    234     if(Draw3D||DrawAtoms)
    235     {
    236         glutInit(&argc,argv);
    237         glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
    238         glutCreateWindow("原子示例");
    239         glutReshapeFunc(ChangeSize);
    240         glutDisplayFunc(RenderScene);
    241         if(DrawAtoms)
    242             glutTimerFunc(100,TimerFunc,1);
    243         else
    244             glutTimerFunc(1,TimerFunc,1);
    245     }
    246 
    247     SetupRC();
    248     glutMainLoop();
    249 }
    250 void DrawTR()
    251 {
    252     glBegin(GL_TRIANGLES);
    253         //
    254         glColor3f(1.0f,0.0f,0.0f);
    255         glVertex3f(0.0f,1.0f,0.0f);
    256 
    257         glColor3f(0.0f,1.0f,0.0f);
    258         glVertex3f(-1.0f,-1.0f,1.0f);
    259 
    260         glColor3f(0.0f,0.0f,1.0f);
    261         glVertex3f(1.0f,-1.0f,1.0f);
    262 
    263         //
    264         glColor3f(1.0f,0.0f,0.0f);
    265         glVertex3f(0.0f,1.0f,0.0f);
    266 
    267         glColor3f(0.0f,0.0f,1.0f);
    268         glVertex3f(1.0f,-1.0f,1.0f);
    269 
    270         glColor3f(0.0f,1.0f,0.0f);
    271         glVertex3f(1.0f,-1.0f,-1.0f);
    272 
    273         //
    274         glColor3f(1.0f,0.0f,0.0f);
    275         glVertex3f(0.0f,1.0f,0.0f);
    276 
    277         glColor3f(0.0f,1.0f,0.0f);
    278         glVertex3f(1.0f,-1.0f,-1.0f);
    279 
    280         glColor3f(0.0f,0.0f,1.0f);
    281         glVertex3f(-1.0f,-1.0f,-1.0f);
    282 
    283         //
    284         glColor3f(1.0f,0.0f,0.0f);
    285         glVertex3f(0.0f,1.0f,0.0f);
    286 
    287         glColor3f(0.0f,0.0f,1.0f);
    288         glVertex3f(-1.0f,-1.0f,-1.0f);
    289 
    290         glColor3f(0.0f,1.0f,0.0f);
    291         glVertex3f(-1.0f,-1.0f,1.0f);
    292 
    293         glEnd();
    294 }
    295 
    296 void DrawDUA()
    297 {
    298     glBegin(GL_QUADS);
    299 
    300         glColor3f(0.0f,1.0f,0.0f);
    301         glVertex3f(1.0f,1.0f,-1.0f);
    302         glVertex3f(-1.0f,1.0f,-1.0f);
    303         glVertex3f(-1.0f,1.0f,1.0f);
    304         glVertex3f(1.0f,1.0f,1.0f);
    305 
    306         glColor3f(1.0f,0.5f,0.0f);
    307         glVertex3f(1.0f,-1.0f,1.0f);
    308         glVertex3f(-1.0f,-1.0f,1.0f);
    309         glVertex3f(-1.0f,-1.0f,-1.0f);
    310         glVertex3f(1.0f,-1.0f,-1.0f);
    311 
    312         glColor3f(1.0f,0.0f,0.0f);
    313         glVertex3f(1.0f,1.0f,1.0f);
    314         glVertex3f(-1.0f,1.0f,1.0f);
    315         glVertex3f(-1.0f,-1.0f,1.0f);
    316         glVertex3f(1.0f,-1.0f,1.0f);
    317 
    318         glColor3f(1.0f,1.0f,0.0f);
    319         glVertex3f(1.0f,-1.0f,-1.0f);
    320         glVertex3f(-1.0f,-1.0f,-1.0f);
    321         glVertex3f(-1.0f,1.0f,-1.0f);
    322         glVertex3f(1.0f,1.0f,-1.0f);
    323 
    324         glColor3f(0.0f,0.0f,1.0f);
    325         glVertex3f(-1.0f,1.0f,1.0f);
    326         glVertex3f(-1.0f,1.0f,-1.0f);
    327         glVertex3f(-1.0f,-1.0f,-1.0f);
    328         glVertex3f(-1.0f,-1.0f,1.0f);
    329         glEnd();
    330 }
    331 
    332 void SunShine(void)
    333 {
    334 
    335     GLfloat sun_light_position[]={0.0f,0.0f,0.0f,1.0f};
    336     GLfloat sun_light_ambient[]={0.0f,0.0f,0.0f,1.0f};
    337     GLfloat sun_light_diffuse[]={1.0f,1.0f,1.0f,1.0f};
    338     GLfloat sun_light_specular[]={1.0f,1.0f,1.0f,1.0f};
    339 
    340     glLightfv(GL_LIGHT0,GL_POSITION,sun_light_position);
    341     glLightfv(GL_LIGHT0,GL_AMBIENT,sun_light_ambient);
    342     glLightfv(GL_LIGHT0,GL_DIFFUSE,sun_light_diffuse);
    343     glLightfv(GL_LIGHT0,GL_SPECULAR,sun_light_specular);
    344 
    345     glEnable(GL_LIGHT0);
    346     glEnable(GL_LIGHTING);
    347     glEnable(GL_DEPTH_TEST);
    348 }
  • 相关阅读:
    C语言的异常处理
    单例类模板
    智能指针模板
    数组类指针
    类模板
    函数模板
    shell 修改工作路径
    把目录C:Python34PCI_Codechapter2加到系统路径中
    twoSum
    归并排序
  • 原文地址:https://www.cnblogs.com/mxdmxdmxd78/p/5491941.html
Copyright © 2020-2023  润新知