2024年5月2日 星期四

電腦圖學 Week11

 #Week11

  1. week11-1_TRT
  2. 安裝freeglut,把lib\libfreeglut.a複製成libglut32.a
  3. File-New-Project, GLUT專案 week10-1_TRT
  4. 貼上上周的week10-1_glutWireCube_mybody_myArm
  5. 的程式碼
    程式碼:
    1. #include <GL/glut.h>
    2. void myBody()
    3. {
    4.     glPushMatrix();
    5.         glColor3f(1,0,0);
    6.         glutWireCube(0.6);///myBody()
    7. glPopMatrix();
    8. }
    9. void myArm()
    10. {
    11.     glPushMatrix();
    12.         glColor3f(0,1,0);
    13.         glScalef(1,0.4,0.4);
    14.         glutWireCube(0.3);///myBody()
    15. glPopMatrix();
    16. }
    17. void display()
    18. {
    19. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    20.     myBody();
    21.     myArm();

    22. glutSwapBuffers();

    23. }
    24. int main(int argc, char*argv[])
    25. {
    26. glutInit(&argc, argv);
    27. glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    28. glutCreateWindow("week09 Microsoft Visual Studio");
    29. glutDisplayFunc(display);
    30. glutMainLoop();
    31. }
  6. 再去做更改增加glPushMatrix(); glTranslatef();        glRotatef(angle++,0,0,1);       glTranslatef(0.15,0,0);       myArm();    glPopMatrix();
    程式碼
    1. #include <GL/glut.h>
    2. void myBody()
    3. {
    4.     glPushMatrix();
    5.         glColor3f(1,0,0);
    6.         glutWireCube(0.6);///myBody()
    7. glPopMatrix();
    8. }
    9. void myArm()
    10. {
    11.     glPushMatrix();
    12.         glColor3f(0,1,0);
    13.         glScalef(1,0.4,0.4);
    14.         glutWireCube(0.3);///myBody()
    15. glPopMatrix();
    16. }
    17. float angle=0;
    18. void display()
    19. {
    20. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    21.     myBody();
    22.     glPushMatrix();
    23.         //glTranslatef();
    24.         glRotatef(angle++,0,0,1);
    25.         glTranslatef(0.15,0,0);
    26.         myArm();
    27.     glPopMatrix();
    28. glutSwapBuffers();

    29. }
    30. int main(int argc, char*argv[])
    31. {
    32. glutInit(&argc, argv);
    33. glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    34. glutCreateWindow("week11");
    35. glutDisplayFunc(display);
    36. glutIdleFunc(display);
    37. glutMainLoop();
    38. }

  7. week11-1_obj_gundam__opencv_texture_lighting
  8. Setting-Compiler要加入OpenCV相關的 3個設定
  9. -compiler的include要加入 C:\OpenCV2.1\include 
    -linker的lib要加入C:\OpenCV\lib
    -linker設定 ,要加入cv210 cxcore210 highgui210

  10. # week11-2_glm_gundam_opencv_texture_lighting

    不要急,這個用 GitHub 下載下來、複製整個目錄、改檔名、改Title

    安裝 OpenCV 2.1 小心! Add PATH,用預設目錄

    重開 CodeBlocks, Setting-Compiler 裡要改3個地方


    接下來,再把 GitHub 的程式倉庫下載下來, week09-1_glm_gundam_opencv_texture_lighting 拿來用,複製成 week11-2_glm_gundam_opencv_texture lighting


    有兩種下載法。第1種是用 Git Bash 下指令

    cd desktop

    git clone https://github.com/jsyeh/2024graphicsa

    cd 2024graphica

    start. 開檔案總管,把 week09-1目錄 複製到桌面,再改目錄名


    第二種作法,在GitHub 網站

    https://github.com/jsyeh/2024graphicsa 點綠色的 Code 的

    Download ZIP 再解壓縮,也能把 week09-1目錄,拉到桌面, 再改目錄名哦!

    File-Open 開桌面 week11-2_glm_gundam_opencv_texture_lighting 裡面的再改 week11-2 glm gundam opencv texture_lighting.cbp


    開起來後,再改專案的 Title 變成

    week11-2_glm_gundam_opencv_texture_lighting

  11. # Maya 切割、匯出OBJ

    要有 Autodesk 的帳號,註冊 Maya教育版, 寄學生證認證,就可以用了

    - handA.obj + handA.mtl

    - handB.obj + handB.mtl

  12. # 繼續修改 week11-2_glm_gundam_opencv_texture_lighting

  13. 把剛剛的 handA.obj handA.mtl handB.obj handB.mtl放到 data目錄

  14. 改程式 GLMmodel pmodel = NULL;改成 cpp

    GLMmodel * pmodel= NULL;

    GLMmodel * handA = NULL;

    GLMmodel * handB = NULL;

  15. 再做修改 void drawmodel(){...} 複製 2段程式 drawHandA() drawHandB() 裡面的pmodel 也換成對應的 handA 和 handB 一中月
  16. 1
  17. 1 程式碼:
    1. ///先把 week08-1_glm_gundam 的程式貼上來
    2. ///等一下, 要再加貼圖的 18行程式
    3. #include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
    4. #include <opencv/cv.h>
    5. #include <GL/glut.h>
    6. int myTexture(char * filename)
    7. {
    8. IplImage * img = cvLoadImage(filename); ///OpenCV讀圖
    9. cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
    10. glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
    11. GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
    12. glGenTextures(1, &id); /// 產生Generate 貼圖ID
    13. glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID
    14. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
    15. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
    16. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /// 貼圖參數, 放大時的內插, 用最近點
    17. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /// 貼圖參數, 縮小時的內插, 用最近點
    18. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    19. return id;
    20. }
    21. #include <GL/glut.h>
    22. #include "glm.h"
    23. GLMmodel * pmodel = NULL;
    24. GLMmodel * handA = NULL;
    25. GLMmodel * handB = NULL;
    26. void drawhandA(void)
    27. {
    28. if (!handA) {
    29. handA = glmReadOBJ("data/handA.obj");
    30. if (!handA) exit(0);
    31. glmUnitize(handA);
    32. glmFacetNormals(handA);
    33. glmVertexNormals(handA, 90.0);
    34. }
    35. glmDraw(handA, GLM_SMOOTH | GLM_TEXTURE);
    36. }
    37. void drawhandB(void)
    38. {
    39. if (!handB) {
    40. handB= glmReadOBJ("data/handB.obj");
    41. if (!handB) exit(0);
    42. glmUnitize(handB);
    43. glmFacetNormals(handB);
    44. glmVertexNormals(handB, 90.0);
    45. }
    46. glmDraw(handB, GLM_SMOOTH | GLM_TEXTURE);
    47. }
    48. float angle = 0; ///加這行, 讓它轉動
    49. void display()
    50. {
    51. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    52. glPushMatrix(); ///加這行, 讓它轉動
    53. glRotatef(angle++, 0, 1, 0); ///加這行, 讓它轉動
    54. drawhandA(); //glutSolidTeapot( 0.3 );
    55. glPopMatrix(); ///加這行, 讓它轉動
    56. glutSwapBuffers();
    57. }
    58. const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
    59. const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    60. const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    61. const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };///加這行, 讓它轉動
    62. const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
    63. const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
    64. const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    65. const GLfloat high_shininess[] = { 100.0f };
    66. int main(int argc, char*argv[])
    67. {
    68. glutInit(&argc, argv);
    69. glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    70. glutCreateWindow("week08 Gundam");
    71. glutDisplayFunc(display);
    72. glutIdleFunc(display); ///加這行, 讓它轉動
    73. myTexture("data/Diffuse.jpg");
    74. glEnable(GL_DEPTH_TEST);
    75. glDepthFunc(GL_LESS);
    76. glEnable(GL_LIGHT0);
    77. glEnable(GL_NORMALIZE);
    78. glEnable(GL_COLOR_MATERIAL);
    79. glEnable(GL_LIGHTING);
    80. glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
    81. glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    82. glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    83. glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    84. glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
    85. glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    86. glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    87. glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
    88. glutMainLoop();
    89. }



沒有留言:

張貼留言