2020年6月10日 星期三

Week15 - 07161045

glutPerspectiveglFtustum

  • 開啟內建模型
     

  • 改成glFtustum
     
     

攝影機

  • resize為要更改的區塊
     
  • 視窗縮放,物件會跟著縮放
    

     
  • 將參數改成aspect ratio(ar),但物件不會被影響
   

gluLookAt

     

茶壺-1
  • 程式碼如下:
#ifdef __APPLE__
    #include <GLUT/glut.h>
      #else
        #include <GL/glut.h>
          #endif

              #include <stdlib.h>

                  static int slices = 16;
                    static int stacks = 16;

                        /* GLUT callback Handlers */
                          float eyeX=0, eyeY=0, eyeZ=1; ///TODO3 for gluLookAt()
                            float centerX=0, centerY=0, centerZ=0;///TODO3 for gluLookAt()
                              static void resize(int width, int height)
                                {
                                      const float ar = (float) width / (float) height;

                                          glViewport(0, 0, width, height);
                                            glMatrixMode(GL_PROJECTION);
                                              glLoadIdentity();
                                                ///glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
                                                  gluPerspective( 60, ar, 0.001, 1000 );///TODO3
                                                    ///glOrtho(-1,+1, -1,+1, -1,+1);///預設值,很限制
                                                      ///glOrtho(-3.4, +3.4,  -2.2, +2.2, -6.0, +16.0);

                                                          glMatrixMode(GL_MODELVIEW);
                                                            glLoadIdentity() ;///TODO3 for gluLookAt()
                                                              gluLookAt(eyeX,eyeY,eyeZ, centerX,centerY,centerZ, 0,1,0);
                                                            }

                                                                static void display(void)
                                                                  {
                                                                        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

                                                                            glutSolidTeapot(0.3);///TODO3,只放我們的Teapot

                                                                                glutSwapBuffers();
                                                                              }

                                                                                  ///key全刪....

                                                                                      static void idle(void)
                                                                                        {
                                                                                              ///TODO3: 等一下要在這裡做動作....
                                                                                                glutPostRedisplay();
                                                                                              }

                                                                                                  const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
                                                                                                    const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
                                                                                                      const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
                                                                                                        const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };

                                                                                                            const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
                                                                                                              const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
                                                                                                                const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
                                                                                                                  const GLfloat high_shininess[] = { 100.0f };

                                                                                                                      /* Program entry point */

                                                                                                                          int main(int argc, char *argv[])
                                                                                                                            {
                                                                                                                                  glutInit(&argc, argv);
                                                                                                                                    glutInitWindowSize(640,480);
                                                                                                                                      glutInitWindowPosition(10,10);
                                                                                                                                        glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

                                                                                                                                            glutCreateWindow("GLUT Shapes");

                                                                                                                                                glutReshapeFunc(resize);
                                                                                                                                                  glutDisplayFunc(display);
                                                                                                                                                    ///glutKeyboardFunc(key);
                                                                                                                                                      glutIdleFunc(idle);

                                                                                                                                                          glClearColor(1,1,1,1);

                                                                                                                                                              glEnable(GL_DEPTH_TEST);
                                                                                                                                                                glDepthFunc(GL_LESS);

                                                                                                                                                                    glEnable(GL_LIGHT0);
                                                                                                                                                                      glEnable(GL_NORMALIZE);
                                                                                                                                                                        glEnable(GL_COLOR_MATERIAL);
                                                                                                                                                                          glEnable(GL_LIGHTING);

                                                                                                                                                                              glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
                                                                                                                                                                                glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
                                                                                                                                                                                  glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
                                                                                                                                                                                    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

                                                                                                                                                                                        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);

                                                                                                                                                                                                  glutMainLoop();

                                                                                                                                                                                                      return EXIT_SUCCESS;
                                                                                                                                                                                                    }

                                                                                                                                                                                                         

                                                                                                                                                                                                    茶壺-2
                                                                                                                                                                                                    • 程式碼如下:
                                                                                                                                                                                                    /*
                                                                                                                                                                                                       * GLUT Shapes Demo
                                                                                                                                                                                                         *
                                                                                                                                                                                                           * Written by Nigel Stewart November 2003
                                                                                                                                                                                                             *
                                                                                                                                                                                                               * This program is test harness for the sphere, cone
                                                                                                                                                                                                                 * and torus shapes in GLUT.
                                                                                                                                                                                                                   *
                                                                                                                                                                                                                     * Spinning wireframe and smooth shaded shapes are
                                                                                                                                                                                                                       * displayed until the ESC or q key is pressed.  The
                                                                                                                                                                                                                         * number of geometry stacks and slices can be adjusted
                                                                                                                                                                                                                           * using the + and - keys.
                                                                                                                                                                                                                             */

                                                                                                                                                                                                                                #ifdef __APPLE__
                                                                                                                                                                                                                                  #include <GLUT/glut.h>
                                                                                                                                                                                                                                    #else
                                                                                                                                                                                                                                      #include <GL/glut.h>
                                                                                                                                                                                                                                        #endif

                                                                                                                                                                                                                                            #include <stdlib.h>

                                                                                                                                                                                                                                                static int slices = 16;
                                                                                                                                                                                                                                                  static int stacks = 16;

                                                                                                                                                                                                                                                      /* GLUT callback Handlers */
                                                                                                                                                                                                                                                        float eyeX=0, eyeY=0, eyeZ=1; ///TODO3 for gluLookAt()
                                                                                                                                                                                                                                                          float centerX=0, centerY=0, centerZ=0;///TODO3 for gluLookAt()
                                                                                                                                                                                                                                                            static void resize(int width, int height)
                                                                                                                                                                                                                                                              {
                                                                                                                                                                                                                                                                    const float ar = (float) width / (float) height;

                                                                                                                                                                                                                                                                        glViewport(0, 0, width, height);
                                                                                                                                                                                                                                                                          glMatrixMode(GL_PROJECTION);
                                                                                                                                                                                                                                                                            glLoadIdentity();
                                                                                                                                                                                                                                                                              ///glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
                                                                                                                                                                                                                                                                                gluPerspective( 60, ar, 0.001, 1000 );
                                                                                                                                                                                                                                                                                  ///glOrtho(-1,+1, -1,+1, -1,+1);///預設值,很限制
                                                                                                                                                                                                                                                                                    ///glOrtho(-3.4, +3.4,  -2.2, +2.2, -6.0, +16.0);

                                                                                                                                                                                                                                                                                        glMatrixMode(GL_MODELVIEW);
                                                                                                                                                                                                                                                                                          glLoadIdentity() ;///TODO3 for gluLookAt()
                                                                                                                                                                                                                                                                                            gluLookAt(eyeX,eyeY,eyeZ, centerX,centerY,centerZ, 0,1,0);
                                                                                                                                                                                                                                                                                          }

                                                                                                                                                                                                                                                                                              static void display(void)
                                                                                                                                                                                                                                                                                                {
                                                                                                                                                                                                                                                                                                      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

                                                                                                                                                                                                                                                                                                          glutSolidTeapot(0.3);

                                                                                                                                                                                                                                                                                                              glutSwapBuffers();
                                                                                                                                                                                                                                                                                                            }

                                                                                                                                                                                                                                                                                                                ///key全刪....

                                                                                                                                                                                                                                                                                                                    static void idle(void)
                                                                                                                                                                                                                                                                                                                      {
                                                                                                                                                                                                                                                                                                                            glutPostRedisplay();
                                                                                                                                                                                                                                                                                                                          }

                                                                                                                                                                                                                                                                                                                              const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
                                                                                                                                                                                                                                                                                                                                const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
                                                                                                                                                                                                                                                                                                                                  const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
                                                                                                                                                                                                                                                                                                                                    const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };

                                                                                                                                                                                                                                                                                                                                        const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
                                                                                                                                                                                                                                                                                                                                          const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
                                                                                                                                                                                                                                                                                                                                            const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
                                                                                                                                                                                                                                                                                                                                              const GLfloat high_shininess[] = { 100.0f };

                                                                                                                                                                                                                                                                                                                                                  /* Program entry point */
                                                                                                                                                                                                                                                                                                                                                    void motion(int x, int y)///TODO5
                                                                                                                                                                                                                                                                                                                                                      {
                                                                                                                                                                                                                                                                                                                                                            ///我們的window:640x480
                                                                                                                                                                                                                                                                                                                                                              eyeX = (x-320)/320.0;///TODO5
                                                                                                                                                                                                                                                                                                                                                                eyeY = (y-240)/240.0;///TODO5;
                                                                                                                                                                                                                                                                                                                                                                  glMatrixMode(GL_MODELVIEW); ///TODO5
                                                                                                                                                                                                                                                                                                                                                                    glLoadIdentity() ;///TODO5
                                                                                                                                                                                                                                                                                                                                                                      gluLookAt(eyeX,eyeY,eyeZ, centerX,centerY,centerZ, 0,1,0);///TODO5
                                                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                                                      int main(int argc, char *argv[])
                                                                                                                                                                                                                                                                                                                                                                        {
                                                                                                                                                                                                                                                                                                                                                                              glutInit(&argc, argv);
                                                                                                                                                                                                                                                                                                                                                                                glutInitWindowSize(640,480);
                                                                                                                                                                                                                                                                                                                                                                                  glutInitWindowPosition(10,10);
                                                                                                                                                                                                                                                                                                                                                                                    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

                                                                                                                                                                                                                                                                                                                                                                                        glutCreateWindow("GLUT Shapes");

                                                                                                                                                                                                                                                                                                                                                                                            glutReshapeFunc(resize);
                                                                                                                                                                                                                                                                                                                                                                                              glutDisplayFunc(display);
                                                                                                                                                                                                                                                                                                                                                                                                ///glutKeyboardFunc(key);
                                                                                                                                                                                                                                                                                                                                                                                                  glutIdleFunc(idle);
                                                                                                                                                                                                                                                                                                                                                                                                    glutMotionFunc(motion);///TODO5: 用motion來控制camera

                                                                                                                                                                                                                                                                                                                                                                                                        glClearColor(1,1,1,1);

                                                                                                                                                                                                                                                                                                                                                                                                            glEnable(GL_DEPTH_TEST);
                                                                                                                                                                                                                                                                                                                                                                                                              glDepthFunc(GL_LESS);

                                                                                                                                                                                                                                                                                                                                                                                                                  glEnable(GL_LIGHT0);
                                                                                                                                                                                                                                                                                                                                                                                                                    glEnable(GL_NORMALIZE);
                                                                                                                                                                                                                                                                                                                                                                                                                      glEnable(GL_COLOR_MATERIAL);
                                                                                                                                                                                                                                                                                                                                                                                                                        glEnable(GL_LIGHTING);

                                                                                                                                                                                                                                                                                                                                                                                                                            glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
                                                                                                                                                                                                                                                                                                                                                                                                                              glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
                                                                                                                                                                                                                                                                                                                                                                                                                                glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
                                                                                                                                                                                                                                                                                                                                                                                                                                  glLightfv(GL_LIGHT0, GL_POSITION, light_position);

                                                                                                                                                                                                                                                                                                                                                                                                                                      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);

                                                                                                                                                                                                                                                                                                                                                                                                                                                glutMainLoop();

                                                                                                                                                                                                                                                                                                                                                                                                                                                    return EXIT_SUCCESS;
                                                                                                                                                                                                                                                                                                                                                                                                                                                  }

                                                                                                                                                                                                                                                                                                                                                                                                                                                       

                                                                                                                                                                                                                                                                                                                                                                                                                                                  沒有留言:

                                                                                                                                                                                                                                                                                                                                                                                                                                                  張貼留言