open吧 关注:3,133贴子:31,568
  • 9回复贴,共1


1楼2010-11-27 12:55回复
    几何体的简单变换
    #include <stdlib.h>
    #include <gl/glut.h>
    void init(void)
    {
    glClearColor (0.0, 0.0, 0.0, 0.0);
    glShadeModel (GL_FLAT);
    }
    void draw_triangle(void)
    {
    glBegin (GL_LINE_LOOP);
    glVertex2f(0.0, 25.0);
    glVertex2f(25.0, -25.0);
    glVertex2f(-25.0, -25.0);
    glEnd();
    }
    // 绘制长方体 width,height,depth分别为长方体的长,高和深度
    void DrawCube(GLfloat width, GLfloat height ,GLfloat depth)
    {
    GLfloat x = width/2, y = height/2, z = depth/2;
    glBegin(GL_QUADS);                     // 绘制长方体的各面
    // 前面(front)
    glColor3f(0.5f, 1.0f, 0.5f);            // 设置当前颜色(各对面颜色相同)
    glVertex3f(-x, -y, z);                    // 前面四边形的左下顶点(正视)
    glVertex3f( x, -y, z);                    // 前面四边形的右下顶点
    glVertex3f( x,   y, z);                    // 前面四边形的右上顶点
    glVertex3f(-x,   y, z);                    // 前面四边形的左上顶点
    // 背面(back)
    glVertex3f( x, -y, -z);                    // 背面四边形的左下顶点(正视)
    glVertex3f(-x, -y, -z);                    // 背面四边形的右下顶点
    glVertex3f(-x,   y, -z);                    // 背面四边形的右上顶点
    glVertex3f( x,   y, -z);                    // 背面四边形的左上顶点
    // 右侧面(right)
    glColor3f(0.2f, 0.4f, 0.1f);
    glVertex3f( x, -y,   z);                    // 右侧面四边形的左下顶点(正视)
    glVertex3f( x, -y, -z);                    // 右侧面四边形的右下顶点
    glVertex3f( x,   y, -z);                    // 右侧面四边形的右上顶点
    glVertex3f( x,   y,   z);                    // 右侧面四边形的左上顶点
    // 左侧面(left)
    glVertex3f(-x, -y, -z);                    // 左侧面四边形的左下顶点(正视)
    


    2楼2010-11-27 16:58
    回复
      glVertex3f(-x, -y,   z);                    // 左侧面四边形的右下顶点
      glVertex3f(-x,   y,   z);                    // 左侧面四边形的右上顶点
      glVertex3f(-x,   y, -z);                    // 左侧面四边形的左上顶点
      // 顶面(top)
      glColor3f(0.2f, 0.8f, 0.0f);
      glVertex3f(-x,   y,   z);                    // 顶面四边形的左下顶点(正视)
      glVertex3f( x,   y,   z);                    // 顶面四边形的右下顶点
      glVertex3f( x,   y, -z);                    // 顶面四边形的右上顶点
      glVertex3f(-x,   y, -z);                    // 顶面四边形的左上顶点
      // 底面(bottom)
      glVertex3f(-x, -y, -z);                    // 底面四边形的左下顶点(正视)
      glVertex3f( x, -y, -z);                    // 底面四边形的右下顶点
      glVertex3f( x, -y,   z);                    // 底面四边形的右上顶点
      glVertex3f(-x, -y,   z);                    // 底面四边形的左上顶点
      glEnd();
      }
      void display(void)
      {    // display callback, clear frame buffer and z buffer
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);         // 清除场景和深度缓存
      glLoadIdentity();                    // 重置当前矩阵
      //在此处添加代码进行绘制:
      glColor3f (1.0, 0.0, 0.0);
      draw_triangle ();
      glEnable (GL_LINE_STIPPLE);
      glLineStipple (1, 0xF0F0);
      glLoadIdentity ();
      glTranslatef (-20.0, 0.0, 0.0);
      draw_triangle ();
      glLineStipple (1, 0xF00F);
      glLoadIdentity ();
      glScalef (1.5, 0.5, 1.0);
      draw_triangle ();
      glLineStipple (1, 0x8888);
      glLoadIdentity ();
      glRotatef (90.0, 0.0, 0.0, 1.0);
      draw_triangle ();
      glDisable (GL_LINE_STIPPLE);
      glTranslatef(-2.0f, 0.0f,-8.0f);            // 左移2.0f,并移入屏幕8.0f
      // 绘制金字塔
      glClearDepth(1000.0f);
      


      3楼2010-11-27 16:58
      回复
        十字架的动画
        #include <stdlib.h>
        #include <GL/glut.h>
        void DrawCube(GLfloat width, GLfloat height ,GLfloat depth)
        {
             GLfloat x = width/2, y = height/2, z = depth/2;
             glBegin(GL_QUADS);                              // 绘制长方体的各面
                 // 前面(front)
                 glColor3f(0.5f, 1.0f, 0.5f);       // 设置当前颜色(各对面颜色相同)
                 glVertex3f(-x, -y, z);                      // 前面四边形的左下顶点(正视)
                 glVertex3f( x, -y, z);                      // 前面四边形的右下顶点
                 glVertex3f( x,   y, z);                      // 前面四边形的右上顶点
                 glVertex3f(-x,   y, z);                      // 前面四边形的左上顶点
                 // 背面(back)
                 glVertex3f( x, -y, -z);                      // 背面四边形的左下顶点(正视)
                 glVertex3f(-x, -y, -z);                      // 背面四边形的右下顶点
                 glVertex3f(-x,   y, -z);                      // 背面四边形的右上顶点
                 glVertex3f( x,   y, -z);                      // 背面四边形的左上顶点
                
                 // 右侧面(right)
                 glColor3f(0.2f, 0.4f, 0.1f);
                 glVertex3f( x, -y,   z);                  // 右侧面四边形的左下顶点(正视)
                 glVertex3f( x, -y, -z);                      // 右侧面四边形的右下顶点
        


        5楼2010-11-27 17:03
        回复
                   glVertex3f( x,   y, -z);                      // 右侧面四边形的右上顶点
                   glVertex3f( x,   y,   z);                      // 右侧面四边形的左上顶点
                   // 左侧面(left)
                   glVertex3f(-x, -y, -z);                  // 左侧面四边形的左下顶点(正视)
                   glVertex3f(-x, -y,   z);                      // 左侧面四边形的右下顶点
                   glVertex3f(-x,   y,   z);                      // 左侧面四边形的右上顶点
                   glVertex3f(-x,   y, -z);                      // 左侧面四边形的左上顶点
                   // 顶面(top)
                   glColor3f(0.2f, 0.8f, 0.0f);
                   glVertex3f(-x,   y,   z);                      // 顶面四边形的左下顶点(正视)
                   glVertex3f( x,   y,   z);                      // 顶面四边形的右下顶点
                   glVertex3f( x,   y, -z);                      // 顶面四边形的右上顶点
                   glVertex3f(-x,   y, -z);                      // 顶面四边形的左上顶点
                   // 底面(bottom)
                   glVertex3f(-x, -y, -z);                      // 底面四边形的左下顶点(正视)
                   glVertex3f( x, -y, -z);                      // 底面四边形的右下顶点
          


          6楼2010-11-27 17:03
          回复
                     glVertex3f( x, -y,   z);                      // 底面四边形的右上顶点
                     glVertex3f(-x, -y,   z);                      // 底面四边形的左上顶点
                 glEnd();
            }
            void drawcross(void)
            {
                  // display callback, clear frame buffer and z buffer
                //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);         // 清除场景和深度缓存
                //glLoadIdentity();                    // 重置当前矩阵
               
                    // 绘制十字架        
                 //glLoadIdentity();
            //    glTranslatef(3.0f, 0.0f, 0.0f);                  // 往右移4.0f
                 glRotatef(15.0f, 0.0f, 1.0f, 0.0f);              // 绕Y轴逆时针旋转10度
                 DrawCube(2.0f, 0.6f, 0.6f);                      // 绘制一个长方体
                 DrawCube(0.6f, 2.0f, 0.6f);                      // 绘制另一个长方体
                 glLoadIdentity();
                 // 绘制结束
            }
            static GLfloat theta[] = {0.0,0.0,0.0};
            static GLint axis = 2;
            static GLfloat view_x=0.0;
            static GLfloat view_y=0.0;
            static GLfloat view_z=0.0;
            void display(void)
            {
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            /* Update viewer position in modelview matrix */
                 glLoadIdentity();
                 gluLookAt(0.0,0.0,4.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
            /* rotate cube */
                 glDepthFunc(GL_LEQUAL);
                 glTranslatef(view_x, view_y, view_z);
                 glRotatef(theta[0], 1.0, 0.0, 0.0);
                 glRotatef(theta[1], 0.0, 1.0, 0.0);
                 glRotatef(theta[2], 0.0, 0.0, 1.0);
            drawcross();
            glFlush();
                 glutSwapBuffers();
            }
            void mouse(int btn, int state, int x, int y)
            {
                 if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) axis = 0;
                 if(btn==GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) axis = 1;
            


            7楼2010-11-27 17:03
            回复
                   if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) axis = 2;
                   theta[axis] += 2.0;
                   if( theta[axis] > 360.0 ) theta[axis] -= 360.0;
                   display();
              }
              void keys(unsigned char key, int x, int y)
              {
                  if(key == 'w'||key=='W')     { view_y=view_y+0.1;}
                  if(key == 's'||key=='S')    { view_y=view_y-0.1;}
                  if(key == 'a'||key=='A')    { view_x=view_x-0.1;}  
                  if(key == 'd'||key == 'D')     { view_x=view_x+0.1;}
                  if(key == '1')    { view_z=view_z+0.1;}
                  if(key == '2')     { view_z=view_z-0.1;}
                  display();
              }
              void myReshape(int w, int h)
              {
              glViewport(0, 0, w, h);
              /* Use a perspective view */
              glMatrixMode(GL_PROJECTION);
              glLoadIdentity();
                   if(w<=h) glFrustum(-2.0, 2.0, -2.0 * (GLfloat) h/ (GLfloat) w,
                      2.0* (GLfloat) h / (GLfloat) w, 2.0, 20.0);
                   else glFrustum(-6.0, 6.0, -6.0 * (GLfloat) w/ (GLfloat) h,
                      6.0* (GLfloat) w / (GLfloat) h, 2.0, 20.0);
              /* Or we can use gluPerspective */
              /* gluPerspective(45.0, w/h, -10.0, 10.0); */
              glMatrixMode(GL_MODELVIEW);
              }
              void
              main(int argc, char **argv)
              {
              glutInit(&argc, argv);
              glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
              glutInitWindowSize(500, 500);
              glutInitWindowPosition(200,150);
              glutCreateWindow("colorcube");
              glutReshapeFunc(myReshape);
              glutDisplayFunc(display);
                   glutMouseFunc(mouse);
                   glutKeyboardFunc(keys);
                   glEnable(GL_DEPTH_TEST);
              glutMainLoop();
              }


              8楼2010-11-27 17:03
              回复
                    glPopMatrix();
                    //   绘制第一行第三列的球体,有漫反射和镜面反射,高光泽度,无环境光
                    glPushMatrix();
                    glTranslatef (1.25, 3.0, 0.0);
                    glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
                    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
                    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
                    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
                    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
                    glutSolidSphere(1.0, 16, 16);
                    glPopMatrix();
                    //   绘制第一行第四列的球体,有漫反射和发射光,无环境光或镜面反射光
                    glPushMatrix();
                    glTranslatef (3.75, 3.0, 0.0);
                    glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
                    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
                    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
                    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
                    glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
                    glutSolidSphere(1.0, 16, 16);
                    glPopMatrix();
                    //   绘制第二行第一列的球体,有环境光和漫反射光,无镜面反射光
                    glPushMatrix();
                    glTranslatef (-3.75, 0.0, 0.0);
                    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
                    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
                    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
                    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
                    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
                    glutSolidSphere(1.0, 16, 16);
                    glPopMatrix();
                    //   绘制第二行第二列的球体,有环境光、漫反射和镜面反射光,低光泽度
                    glPushMatrix();
                    glTranslatef (-1.25, 0.0, 0.0);
                    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
                    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
                    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
                    glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
                    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
                    glutSolidSphere(1.0, 16, 16);
                    glPopMatrix();
                    //   绘制第二行第三列的球体,有环境光、漫反射和镜面反射光,高光泽度
                    glPushMatrix();
                    glTranslatef (1.25, 0.0, 0.0);
                    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
                    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
                    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
                    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
                    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
                


                10楼2010-11-27 17:07
                回复
                      glutSolidSphere(1.0, 16, 16);
                      glPopMatrix();
                      //   绘制第二行第四列的球体,有环境光、漫反射和发射光,无镜面反射光
                      glPushMatrix();
                      glTranslatef (3.75, 0.0, 0.0);
                      glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
                      glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
                      glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
                      glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
                      glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
                      glutSolidSphere(1.0, 16, 16);
                      glPopMatrix();
                      //   绘制第三行第一列的球体,有颜色环境光、漫反射,无镜面反射光
                      glPushMatrix();
                      glTranslatef (-3.75, -3.0, 0.0);
                      glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
                      glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
                      glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
                      glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
                      glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
                      glutSolidSphere(1.0, 16, 16);
                      glPopMatrix();
                      //   绘制第三行第二列的球体,有颜色环境光、漫反射和无镜面反射光,无光泽度
                      glPushMatrix();
                      glTranslatef (-1.25, -3.0, 0.0);
                      glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
                      glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
                      glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
                      glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
                      glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
                      glutSolidSphere(1.0, 16, 16);
                      glPopMatrix();
                      //   绘制第三行第三列的球体,有颜色环境光、漫反射和镜面反射光,高光泽度
                      glPushMatrix();
                      glTranslatef (1.25, -3.0, 0.0);
                      glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
                      glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
                      glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
                      glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
                      glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
                      glutSolidSphere(1.0, 16, 16);
                      glPopMatrix();
                      //   绘制第三行第四列的球体,有颜色环境光、漫反射和发射光,无镜面反射光
                      glPushMatrix();
                      glTranslatef (3.75, -3.0, 0.0);
                      glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
                      glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
                      glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
                      glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
                      glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
                      glutSolidSphere(1.0, 16, 16);
                      glPopMatrix();
                      glFlush();
                  }
                  void reshape(int w, int h)
                  {
                      glViewport(0, 0, w, h);
                      glMatrixMode(GL_PROJECTION);
                      glLoadIdentity();
                      if (w <= (h * 2))
                         glOrtho (-6.0, 6.0, -3.0*((GLfloat)h*2)/(GLfloat)w,
                            3.0*((GLfloat)h*2)/(GLfloat)w, -10.0, 10.0);
                      else
                         glOrtho (-6.0*(GLfloat)w/((GLfloat)h*2),
                            6.0*(GLfloat)w/((GLfloat)h*2), -3.0, 3.0, -10.0, 10.0);
                      glMatrixMode(GL_MODELVIEW);
                      glLoadIdentity();
                  }
                  void keyboard(unsigned char key, int x, int y)
                  {
                      switch (key) {
                         case 27:     exit(0);      break;
                  }}
                  int main(int argc, char** argv)
                  {
                      glutInit(&argc, argv);
                      glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
                      glutInitWindowSize (600, 450);
                      glutCreateWindow(argv[0]);
                      init();
                      glutReshapeFunc(reshape);
                      glutDisplayFunc(display);
                      glutKeyboardFunc (keyboard);
                      glutMainLoop();
                      return 0;
                  }
                  


                  11楼2010-11-27 17:07
                  回复

                    看着好困


                    16楼2010-12-29 16:07
                    回复