2024年5月9日 星期四

電腦圖學 Week12

  #Week12

  1. # week12-1_glm_gundam_handA_handb
  2. 不要急,這個用 GitHub 下載下來、複製整個目錄、改檔名、改Title
  3. 安裝 OpenCV 2.1 小心! Add PATH,用預設目錄
  4. Setting-Compiler要加入OpenCV相關的 3個設定
    -compiler的include要加入 C:\OpenCV2.1\include
    -linker的lib要加入C:\OpenCV2.1\lib
    -linker設定 ,要加入cv210 cxcore210 highgui210
  5. 再把 GitHub 的程式下載(兩種下載法 Git指令 or Download ZIP) 再把 week11-2 glm gundam opencv texture lighting 拿來改
  6. week11-2 複製目錄,改目錄名為 week12-1 glm gundam handA handB
  7. 把.cbp檔,改檔名為 week12-1_glm_gundam_handa_handB.cbp
  8. 用 Notepad++ 開.cbp檔,改Title 為 week12-1_glm_gundam_handA_handB 並把對應目錄改好
  9. CodeBlocks File-Open week12-1_glm_gundam_handa_handB.cbp
  10. 要修改的程式:把今天考試的T-R-T 設定正確
  11. 技巧1:把擋住的,註解掉。把旋轉,註解掉。
  12. 技巧2:把用來對照的座標原點,用 glutSolidSphere (0.1, 30, 30);
    glTranslatef(...);
    glRotatef(...);
    glTranslatef(...);
  13. 程式碼:
    1. #include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
    2. #include <opencv/cv.h>
    3. #include <GL/glut.h>
    4. int myTexture(char * filename)
    5. {
    6.     IplImage * img = cvLoadImage(filename); ///OpenCV讀圖
    7.     cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
    8.     glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
    9.     GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
    10.     glGenTextures(1, &id); /// 產生Generate 貼圖ID
    11.     glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID
    12.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
    13.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
    14.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /// 貼圖參數, 放大時的內插, 用最近點
    15.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /// 貼圖參數, 縮小時的內插, 用最近點
    16.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    17.     return id;
    18. }
    19. #include <GL/glut.h>
    20. #include "glm.h"
    21. GLMmodel * pmodel = NULL;
    22. GLMmodel * handA = NULL;
    23. GLMmodel * handB = NULL;
    24. void drawhandA(void)
    25. {
    26.     if (!handA) {
    27. handA  = glmReadOBJ("data/handA.obj");
    28. if (!handA) exit(0);
    29. glmUnitize(handA);
    30. glmFacetNormals(handA);
    31. glmVertexNormals(handA, 90.0);
    32.     }

    33.     glmDraw(handA, GLM_SMOOTH | GLM_TEXTURE);
    34. }
    35. void drawhandB(void)
    36. {
    37.     if (!handB) {
    38. handB= glmReadOBJ("data/handB.obj");
    39. if (!handB) exit(0);
    40. glmUnitize(handB);
    41. glmFacetNormals(handB);
    42. glmVertexNormals(handB, 90.0);
    43.     }

    44.     glmDraw(handB, GLM_SMOOTH | GLM_TEXTURE);
    45. }
    46. void myBody()
    47. {
    48.     glPushMatrix();
    49.         glColor3f(1,0,0);
    50.         glutSolidCube(0.6);///myBody()
    51. glPopMatrix();
    52. }
    53. float angle = 0; ///加這行, 讓它轉動
    54. void display()
    55. {
    56.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    57.     glDisable(GL_TEXTURE_2D);
    58.     myBody();
    59.     glutSolidSphere(0.1,30,30);
    60.     glEnable(GL_TEXTURE_2D);
    61.     glColor3f(1,1,1);

    62.     glPushMatrix(); ///加這行, 讓它轉動
    63.         glTranslatef(0.3,0.3,0);
    64.         glRotatef(angle++, 0, 0, 1);
    65.         glTranslatef(0,-0.3,0);
    66.         drawhandB(); //glutSolidTeapot( 0.3 );
    67.     glPopMatrix(); ///加這行, 讓它轉動

    68.     glPushMatrix(); ///加這行, 讓它轉動
    69.         glTranslatef(-0.3,0.3,0);
    70.         glRotatef(-angle++, 0, 0, 1);
    71.         glTranslatef(0,-0.3,0);
    72.         drawhandA(); //glutSolidTeapot( 0.3 );
    73.     glPopMatrix(); ///加這行, 讓它轉動
    74.     glutSwapBuffers();
    75. }

    76. const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
    77. const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
    78. const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    79. const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };///加這行, 讓它轉動

    80. const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
    81. const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
    82. const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
    83. const GLfloat high_shininess[] = { 100.0f };

    84. int main(int argc, char*argv[])
    85. {
    86.     glutInit(&argc, argv);
    87.     glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    88.     glutCreateWindow("week08 Gundam");
    89.     glutDisplayFunc(display);
    90.     glutIdleFunc(display); ///加這行, 讓它轉動

    91.     myTexture("data/Diffuse.jpg");

    92.     glEnable(GL_DEPTH_TEST);
    93.     glDepthFunc(GL_LESS);

    94.     glEnable(GL_LIGHT0);
    95.     glEnable(GL_NORMALIZE);
    96.     glEnable(GL_COLOR_MATERIAL);
    97.     glEnable(GL_LIGHTING);

    98.     glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    99.     glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    100.     glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    101.     glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    102.     glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    103.     glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    104.     glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    105.     glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    106.     glutMainLoop();
    107. }

  14. # week12-2_glm_gundam_upper_lower

    目標:要把上手臂、下手臂切好、讀入

    事先準備: Maya開啟來,把 handA.obj 讀入,切割出 upperA.obj 和 lowerA.obj


    再把 week12-1_glm_gundam_handA_handB 複製成 week12-2_glm_gundam_upper_lower 里面的.cbp 改檔名成 week12-2_glm_gundam upper_lower.cbp


  15. 再用 Notepad++ 把 Title 和目錄,也更新成 week12-2_glm_gundam_upper_lower

  16. 最後,把 upperA.obj upperA.mtl lowerA.obj lowerA.mtl 放到 week12-2的目錄

  17. 加程式 cpp

    GLMmodel * upperA = NULL;

    GLMmodel * lowerA = NULL;

  18. 再把 void drawHandA()複製修改成void drawUpperA() 和 void drawLowerA()

  19. 程式碼:

    1. #include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
    2. #include <opencv/cv.h>
    3. #include <GL/glut.h>
    4. int myTexture(char * filename)
    5. {
    6.     IplImage * img = cvLoadImage(filename); ///OpenCV讀圖
    7.     cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
    8.     glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
    9.     GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
    10.     glGenTextures(1, &id); /// 產生Generate 貼圖ID
    11.     glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID
    12.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
    13.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
    14.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /// 貼圖參數, 放大時的內插, 用最近點
    15.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /// 貼圖參數, 縮小時的內插, 用最近點
    16.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    17.     return id;
    18. }
    19. #include <GL/glut.h>
    20. #include "glm.h"
    21. GLMmodel * pmodel = NULL;
    22. GLMmodel * handA = NULL;
    23. GLMmodel * handB = NULL;
    24. GLMmodel * upperA = NULL;
    25. GLMmodel * lowerA = NULL;
    26. void drawUpperA(void)
    27. {
    28.     if (!upperA) {
    29. upperA  = glmReadOBJ("data/upperA.obj");
    30. if (!upperA) exit(0);
    31. glmUnitize(upperA);
    32. glmFacetNormals(upperA);
    33. glmVertexNormals(upperA, 90.0);
    34.     }

    35.     glmDraw(upperA, GLM_SMOOTH | GLM_TEXTURE);
    36. }
    37. void drawLowerA(void)
    38. {
    39.     if (!lowerA) {
    40. lowerA= glmReadOBJ("data/lowerA.obj");
    41. if (!lowerA) exit(0);
    42. glmUnitize(lowerA);
    43. glmFacetNormals(lowerA);
    44. glmVertexNormals(lowerA, 90.0);
    45.     }

    46.     glmDraw(lowerA, GLM_SMOOTH | GLM_TEXTURE);
    47. }
    48. void myBody()
    49. {
    50.     glPushMatrix();
    51.         glColor3f(1,0,0);
    52.         glutSolidCube(0.6);///myBody()
    53. glPopMatrix();
    54. }
    55. float angle = 0,da=1; ///加這行, 讓它轉動
    56. void display()
    57. {
    58.     angle+=da;
    59.     if(angle>90)da=-1;
    60.     if(angle<0)da=+1;
    61.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    62.     glDisable(GL_TEXTURE_2D);
    63.     ///myBody();
    64.     ///glutSolidSphere(0.1,30,30);
    65.     glEnable(GL_TEXTURE_2D);
    66.     glColor3f(1,1,1);

    67.     drawUpperA();
    68.     glPushMatrix(); ///加這行, 讓它轉動
    69.         glTranslatef(-0.02,-0.09,0);
    70.         glRotatef(angle,1,0,0);
    71.         glTranslatef(0,-0.21,0);
    72.         drawLowerA();
    73.     glPopMatrix(); ///加這行, 讓它轉動

    74.     glutSwapBuffers();
    75. }

    76. const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
    77. const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
    78. const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    79. const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };///加這行, 讓它轉動

    80. const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
    81. const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
    82. const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
    83. const GLfloat high_shininess[] = { 100.0f };

    84. int main(int argc, char*argv[])
    85. {
    86.     glutInit(&argc, argv);
    87.     glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    88.     glutCreateWindow("week12");
    89.     glutDisplayFunc(display);
    90.     glutIdleFunc(display); ///加這行, 讓它轉動

    91.     myTexture("data/Diffuse.jpg");

    92.     glEnable(GL_DEPTH_TEST);
    93.     glDepthFunc(GL_LESS);

    94.     glEnable(GL_LIGHT0);
    95.     glEnable(GL_NORMALIZE);
    96.     glEnable(GL_COLOR_MATERIAL);
    97.     glEnable(GL_LIGHTING);

    98.     glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    99.     glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    100.     glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    101.     glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    102.     glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    103.     glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    104.     glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    105.     glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    106.     glutMainLoop();
  20. # week12-3_glm_gundam_keyboard_angleID_mouse_motion_angle


    1. 把 week12-2_glm_gundam_uppperA lowerA 複製成


    2. week12-3_glm_gundam_keyboard_angleID_mouse_motion_angle 利用 mouse motion 來改變 angle


    cpp


    float angle = 0, da = 1; //剛剛的舊的程式碼


    void motion(int x, int y) { //加入 mouse motion 對應的函式 angle = y; //當我們的 mouse motion 時,y座標對應角度


    }


    void display()


    { /// angle += da; //不要自己動,要用 mouse motion 來動


    /// if (angle>90) da = -1; /// if (angle<0) da = +1;


    glClear (GL_COLOR BUFFER_BIT|GL_DEPTH_BUFFER_BIT);


    在 int main()裡,加入 glutMotionFunc(motion);

  21. 把 week12-2_glm_gundam_uppperA lowerA 複製成

  22. week12-3_glm_gundam_keyboard_angleID_mouse_motion_angle
  23. 利用 mouse motion 來改變 angle cpp

    float angle = 0, da = 1; //剛剛的舊的程式碼

    void motion(int x, int y) { //加入 mouse motion 對應的函式 angle = y; //當我們的 mouse motion 時,y座標對應角度

    }

    void display()

    { angle += da; //不要自己動,要用 mouse motion 來動

    /// if (angle>90) da = -1; /// if (angle<0) da = +1;

    glClear (GL_COLOR BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

  24. 註解掉這三行
    ///angle+=da;//不要自己動要用mouse motion來動
        ///if(angle>90)da=-1;
        ///if(angle<0)da=+1;

    int main()中加入

    glutMotionFunc(motion);

沒有留言:

張貼留言