2017年6月11日 星期日

Week12 劉念慈的上課筆記

20170509電腦圖學

主題:
(1)3D TRT 轉動
(2)矩陣 投影矩陣
(3)攝影機運鏡
(4)會動的機器人
(5)MP3播放
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
TODO 1:

播MP3最簡單 CMP3_MCI.h
#include " CMP3_MCI.h" ///檔案放同目錄
CMP3_MCI myMP3; ///宣告變數
在 main()裡
int main(...)  ///Load檔案
{
         myMP3.Load("音樂.mp3");
         myMP3.Play(); ///Play播放
}
youtube找音樂.影片





























TODO 2:
運鏡 ex:變形金剛導演

(1)下載freeglut,windows,data,glut32檔案。
(2)並將檔案data和glut32拉到windows中,不可直接解壓縮。
(3)打開"Projection" 可以看到運鏡的程式。



TODO 3:
運鏡-茶壺

(1)打開GLUT檔。



(2)改程式碼,換成茶壺運鏡.
  #include <GL/glut.h>
                float eyeX=0, eyeY=0, eyeZ=-0.8;
                float centerX=0, centerY=0, centerZ=0;
                float upX=0, upY=1, upZ=0;
                static void display(void)
                {
                    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                    glColor3d(1,0,0);
                    glPushMatrix();
                        gluLookAt(eyeX, eyeY, eyeZ,
                                  centerX, centerY, centerZ,
                                  upX, upY, upZ);
                        glutSolidTeapot(0.3);
                    glPopMatrix();
                    glutSwapBuffers();
                }

                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_CULL_FACE);
                    ///glCullFace(GL_BACK);
                    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;
                } 
















(3)修改程式,讓茶壺邊旋轉邊運鏡。


 #include <GL/glut.h>
                #include <math.h>
                float eyeX=0, eyeY=0, eyeZ=1;
                float centerX=0, centerY=0, centerZ=0;
                float upX=0, upY=1, upZ=0;
                float angle=0;
                static void display(void)
                {
                  
  glMatrixMode(GL_PROJECTION);
                    glLoadIdentity();
                    gluPerspective(60, 1, 0.001, 10000);
                    glMatrixMode(GL_MODELVIEW);
                    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                    glColor3d(1,0,0);
                    angle+=0.01;
                    eyeX=cos(angle); eyeZ=2*sin(angle);
                    glPushMatrix();
                        gluLookAt(eyeX, eyeY, eyeZ,
                                  centerX, centerY, centerZ,
                                  upX, upY, upZ);
                        glutSolidTeapot(0.3);
                    glPopMatrix();
                    glutSwapBuffers();
                }
                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);
                  
  glutIdleFunc(display);
                    glClearColor(1,1,1,1);
                    ///glEnable(GL_CULL_FACE);
                    ///glCullFace(GL_BACK);
                    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;
                }


TODO 3:
(1)修改作業的程式碼,機器人完成。


    glMatrixMode(GL_PROJECTION);///臨時切換成投影Projection矩陣來調整
                    glLoadIdentity();
                    gluPerspective(60, 1, 0.001, 10000);
                    ///fov: field of view 視野的張角(y方向)
                    ///aspect: xy的比例   zNear, zFar 代表
                    glMatrixMode(GL_MODELVIEW);///馬上切換回去Model View矩陣
                    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                    glColor3d(1,0,0);
                    angle+=dir;
                    if(angle>60)dir = -dir;
                    if(angle<0) dir = -dir;
                    glPushMatrix();
                        gluLookAt(eyeX, eyeY, eyeZ,
                                  centerX, centerY, centerZ,
                                  upX, upY, upZ);
                        glutSolidTeapot(0.3);///head
                        glPushMatrix();
                            glTranslatef(0, -0.3, 0);
                            glColor3f(1,1,1); glutSolidTeapot(0.3);///body
                            glPushMatrix();
                                glTranslatef(0.3, 0,0);///T
                                glRotatef(angle, 0,0,1);///R
                                glTranslatef(0.3, 0,0);///T
                                glutSolidTeapot(0.3);///right upper arm
                                glPushMatrix();
                                    glTranslatef(0.3, 0,0);///T
                                    glRotatef(angle, 0,0,1);///R
                                    glTranslatef(0.3, 0,0);///T
                                    glutSolidTeapot(0.3);///right lower arm
                                glPopMatrix();
                            glPopMatrix();
                            glPushMatrix();
                                glTranslatef(-0.3, 0,0);///T
                                glRotatef(-angle, 0,0,1);///R
                                glTranslatef(-0.3, 0,0);///T
                                glutSolidTeapot(0.3);///left upper arm
                                glPushMatrix();
                                    glTranslatef(-0.3, 0,0);///T
                                    glRotatef(-angle, 0,0,1);///R
                                    glTranslatef(-0.3, 0,0);///T
                                    glutSolidTeapot(0.3);///left lower arm
                                glPopMatrix();
                            glPopMatrix();
                        glPopMatrix();
                    glPopMatrix();
                    glutSwapBuffers();
                }

沒有留言:

張貼留言