2024年5月16日 星期四

電腦圖學 Week13

  #Week13

# Week13

  1. week13-1_glm_gundam_keyboard_angleID_mouse_motion_angle
  2. freeglut 安裝
  3. OpenCV 2.1 安裝
  4. 重開 CodeBlocks,設定 Compiler-Setting 的3個設定
  5. C:\OpenCV2.1\include
  6. C:\OpenCV2.1\lib
  7. cv210 cxcore210 highgui210
  8. 再把上週的
  9. week12-3_glm_gundam_keyboard_angleID_mouse_motion_angle 拿來用


  10. 程式碼:
  11. #include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
    1. #include <opencv/cv.h>
    2. #include <GL/glut.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. float angle[20]={};
    57. int angleID=0;
    58. int oldX=0,oldY=0;
    59. void motion(int x, int y){
    60. angle[angleID]+=y-oldY;
    61. oldX=x;
    62. oldY=y;
    63. glutPostRedisplay();
    64. }
    65. void mouse(int button,int state,int x, int y){
    66. oldX=x;
    67. oldY=y;
    68. }
    69. void keyboard(unsigned char key,int x,int y){
    70. if(key=='0')angleID=0;
    71. if(key=='1')angleID=1;
    72. if(key=='2')angleID=2;
    73. if(key=='3')angleID=3;
    74. }
    75. void display()
    76. {
    77. ///angle+=da;
    78. ///if(angle>90)da=-1;
    79. ///if(angle<0)da=+1;
    80. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    81. glDisable(GL_TEXTURE_2D);
    82. ///myBody();
    83. glutSolidSphere(0.1,30,30);
    84. glEnable(GL_TEXTURE_2D);
    85. glColor3f(1,1,1);
    86. glPushMatrix();
    87. ///glTranslatef();
    88. glRotatef(angle[0],0,0,1);
    89. glTranslatef(0,-0.07,0);
    90. drawUpperA();
    91. glPushMatrix(); ///加這行, 讓它轉動
    92. glTranslatef(-0.02,-0.09,0);
    93. glRotatef(angle[1],1,0,0);
    94. glTranslatef(0,-0.21,0);
    95. drawLowerA();
    96. glPopMatrix(); ///加這行, 讓它轉動
    97. glPopMatrix();
    98. glutSwapBuffers();
    99. }
    100. const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
    101. const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    102. const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    103. const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };///加這行, 讓它轉動
    104. const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
    105. const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
    106. const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    107. const GLfloat high_shininess[] = { 100.0f };
    108. int main(int argc, char*argv[])
    109. {
    110. glutInit(&argc, argv);
    111. glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    112. glutCreateWindow("week13");
    113. glutDisplayFunc(display);
    114. glutIdleFunc(display); ///加這行, 讓它轉動
    115. glutMotionFunc(motion);
    116. glutMouseFunc(mouse);
    117. glutKeyboardFunc(keyboard);
    118. myTexture("data/Diffuse.jpg");
    119. glEnable(GL_DEPTH_TEST);
    120. glDepthFunc(GL_LESS);
    121. glEnable(GL_LIGHT0);
    122. glEnable(GL_NORMALIZE);
    123. glEnable(GL_COLOR_MATERIAL);
    124. glEnable(GL_LIGHTING);
    125. glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
    126. glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    127. glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    128. glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    129. glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
    130. glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    131. glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    132. glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
    133. glutMainLoop();

  12. week13-2_FILE_fopen_fprint_fscanf
  13. 把 week13-1 複製整個目錄,改目錄名、改.cbp名、Notepad++改裡面的 Title
  14. 在 week13-2裡,要加 FILE 指標
  15. #include <stdio.h>
  16. FILE * fin = NULL;

    FILE * fout = NULL;

  17. 在motion()裡,要加一段程式
  18. cpp

    void motion(int x, int y) {

    angle [angleID] += y - oldy;

    oldX = x;

    oldY =y;

    glutPostRedisplay();

    if(fout==NULL) fout = fopen("angle.txt", "w+");

    for(int i=0; i<20; i++){

        printf("%.lf", angle[i]);

        fprintf(fout, "%.lf ", angle[i]);

        }

        printf("\n");

        fprintf(fout, "\n");

    }

  19. 你執行程式時,用mouse motion一邊改變角度,一邊大量產生角度值小黑關掉後,可在目錄裡,看到angle.txt裡面就是剛剛印的一堆數值
  20. 小心, angle.txt 裡面要有空格,不然就錯了。printf()及 fprintf()要加"%.1f"

  21. 現在,要讀
  22. 程式碼:


    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. GLMmodel * body = NULL;
    27. void drawBody(void)
    28. {
    29.     if (!body) {
    30. body  = glmReadOBJ("data/body.obj");
    31. if (!body) exit(0);
    32. glmUnitize(body);
    33. glmFacetNormals(body);
    34. glmVertexNormals(body, 90.0);
    35.     }

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

    47.     glmDraw(upperA, GLM_SMOOTH | GLM_TEXTURE);
    48. }
    49. void drawLowerA(void)
    50. {
    51.     if (!lowerA) {
    52. lowerA= glmReadOBJ("data/lowerA.obj");
    53. if (!lowerA) exit(0);
    54. glmUnitize(lowerA);
    55. glmFacetNormals(lowerA);
    56. glmVertexNormals(lowerA, 90.0);
    57.     }

    58.     glmDraw(lowerA, GLM_SMOOTH | GLM_TEXTURE);
    59. }
    60. void myBody()
    61. {
    62.     glPushMatrix();
    63.         glColor3f(1,0,0);
    64.         glutSolidCube(0.6);///myBody()
    65. glPopMatrix();
    66. }
    67. ///float angle = 0,da=1; ///加這行, 讓它轉動
    68. float angle[20]={};
    69. int angleID=0;
    70. int oldX=0,oldY=0;
    71. #include <stdio.h>
    72. FILE * fin = NULL;
    73. FILE * fout = NULL;
    74. void motion(int x, int y){
    75.     angle[angleID]+=y-oldY;
    76.     oldX=x;
    77.     oldY=y;
    78.     glutPostRedisplay();
    79.     if(fout==NULL) fout = fopen("angle.txt", "w+");
    80.     for(int i=0; i<20; i++){
    81.         printf("%.1f", angle[i]);
    82.         fprintf(fout, "%.1f ", angle[i]);
    83.     }
    84.     printf("\n");
    85.     fprintf(fout, "\n");
    86. }
    87. void mouse(int button,int state,int x, int y){
    88.     oldX=x;
    89.     oldY=y;
    90. }

    91. void keyboard(unsigned char key,int x,int y){
    92.     if(key=='r'){
    93.         if(fin==NULL) fin = fopen("angle.txt", "r");
    94.         for(int i=0; i<20; i++){
    95.             fscanf(fin,"%f", &angle[i]);
    96.         }
    97.         glutPostRedisplay();
    98.     }
    99.     if(key=='0')angleID=0;
    100.     if(key=='1')angleID=1;
    101.     if(key=='2')angleID=2;
    102.     if(key=='3')angleID=3;
    103. }
    104. void display()
    105. {
    106.     ///angle+=da;
    107.     ///if(angle>90)da=-1;
    108.     ///if(angle<0)da=+1;
    109.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    110.     glDisable(GL_TEXTURE_2D);
    111.     ///glutSolidSphere(0.1,30,30);
    112.     glEnable(GL_TEXTURE_2D);
    113.     glColor3f(1,1,1);

    114.     glPushMatrix();
    115.         glRotatef(angle[0],0,1,0);
    116.         drawBody();
    117.         glEnable(GL_TEXTURE_2D);
    118.         glColor3f(1,1,1);

    119.     glPushMatrix();
    120.         glTranslatef(-0.1,0,0);
    121.         glRotatef(angle[1],0,0,1);
    122.         glRotatef(angle[2],1,0,0);
    123.         glTranslatef(0,-0.07,0);
    124.         drawUpperA();
    125.         glPushMatrix(); ///加這行, 讓它轉動
    126.             glTranslatef(-0.02,-0.09,0);
    127.             glRotatef(angle[1],1,0,0);
    128.             glTranslatef(0,-0.21,0);
    129.             drawLowerA();
    130.         glPopMatrix(); ///加這行, 讓它轉動
    131.     glPopMatrix();
    132.     glutSwapBuffers();
    133. }

    134. const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
    135. const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
    136. const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    137. const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };///加這行, 讓它轉動

    138. const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
    139. const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
    140. const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
    141. const GLfloat high_shininess[] = { 100.0f };

    142. int main(int argc, char*argv[])
    143. {
    144.     glutInit(&argc, argv);
    145.     glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    146.     glutCreateWindow("week13");
    147.     glutDisplayFunc(display);
    148.     glutIdleFunc(display); ///加這行, 讓它轉動
    149.     glutMotionFunc(motion);
    150.     glutMouseFunc(mouse);
    151.     glutKeyboardFunc(keyboard);

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

    153.     glEnable(GL_DEPTH_TEST);
    154.     glDepthFunc(GL_LESS);

    155.     glEnable(GL_LIGHT0);
    156.     glEnable(GL_NORMALIZE);
    157.     glEnable(GL_COLOR_MATERIAL);
    158.     glEnable(GL_LIGHTING);

    159.     glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    160.     glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    161.     glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    162.     glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    163.     glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    164.     glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    165.     glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    166.     glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    167.     glutMainLoop();
    168. }





沒有留言:

張貼留言