2021年5月17日 星期一

𝔍𝔒𝔗𝔇-week13

 

電腦圖學_week13

2021/05/17(一)

   今日的上課內容:
  1. 先設定好Compiler
  2. 安裝notepad++
  3. 改工作目錄為現在的路徑
  4. 模型 glm.cpp + glm.h +transformation.c 裡面程式
  5. glm.cpp 和 glm.h copy 專案目錄
  6. glm.cpp 加入目錄(Add)
  7. 將關鍵程式貼入lgmReadOBJ("gunam.obj")  ///檔名
  8. ...
  9. glmDraw(...GLM_TEXTURE);
  10. 模型 gundam.obj gundam..mtl
  11. Diffuse.jpg要上下翻轉
  12. 轉動加打光模型
  13. 用 glRotatef(angle,0,1,0)轉動
  14. 前後用 glPushMatrix() glPopMatrix()保護
  15. 宣告 angle = 0,後面++
  16. glutIdleFunc(display)有空就畫並++
  17. 修正貼圖(z:0的地方,會切到模型)
  18. 修正方法1:貼圖z值調一下
  19. 修正方法2:改GL_DEPTH_TEST的時機(不開3D深度測試,畫背景,再開3D深度測試,畫模型)
  20. 下載gundam.zip裡面有切割好的模型
  21. 把body, arm1, arm2, (hand1, hand2)解壓縮到week13_gundam 專案目錄中
  22. 程式:指標    GLMmodel * body = NULL; 很多份
  23. 讀檔 glmReadOBJ()
  24. 畫模型 glmDraw()
  25. body = glmReadOBJ("body.obj");
  26. 很多份,在gltMainLoop()之前
  27. 直接畫會出事(太大了),要變成-1..+1
  28. 用glmDimensions() 去查模型的長寬高,再以長寬高縮小模型
  29. 要把 arm1正確轉動 T-R-T
  30. 先把手臂移到正中間
  31. 做轉動
  32. 把手臂掛回肩上
⚠️錯誤排解區:
        若出現下面錯誤訊息(圖1-指標找不到圖片),請照步驟檢查
  1. 請先檢查副檔名有無正確(.jpg .jepg)
  2. 請檢查工作目錄有無正確(用notepad++打開目前的.cbp檔)
  3. 看一下工作目錄是不是長這樣<Option working_dir="." />     (11,21行均有working dir
  4. 再次執行檢查錯誤
        若出現下面錯誤訊息(圖1-指標找不到圖片),請照步驟檢查
        ⚠️請把glm.cpp加入(Add)專案中就可以解決問題
⋇因為速度太加上檢查時間有點少,會另外找時間補上照片及成品
0521進度:
⬆️有遇到錯誤,請往上找錯誤排解區(圖1)
                                                    ⬆️有遇到錯誤,請往上找錯誤排解區(圖2)


                                                    ⬆️成功把鋼彈貼圖貼在茶壺上
                                            ⬆️成功讓背景不卡住模型(Diffuse.jpg沒有上下翻轉)
         ⬆️成功讓背景不卡住模型(Diffuse.jpg有用小畫家上下翻轉)


今日程式碼區:
          ///鋼彈貼圖貼在茶壺上
  • #include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可

  • #include <opencv/cv.h>

  • #include <GL/glut.h>

  • GLuint id1, id2; ///TODO:增加2個 貼圖ID

  • int myTexture(char * filename)

  • {

  •     IplImage * img = cvLoadImage(filename); ///OpenCV讀圖

  •     cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)

  •     glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能

  •     GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID

  •     glGenTextures(1, &id); /// 產生Generate 貼圖ID

  •     glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID

  •     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖

  •     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖

  •     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /// 貼圖參數, 放大時的內插, 用最近點

  •     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /// 貼圖參數, 縮小時的內插, 用最近點

  •     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);

  •     return id;

  • }

  • void display()

  • {

  •     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);



  •     glBindTexture(GL_TEXTURE_2D, id1);

  •     glutSolidTeapot(0.3);



  •     glBindTexture(GL_TEXTURE_2D, id2);

  •     glBegin(GL_POLYGON);

  •         glTexCoord2f( 0, 0 ); glVertex2f( -1, -1 );

  •         glTexCoord2f( 0, 1 ); glVertex2f( -1, +1 );

  •         glTexCoord2f( 1, 1 ); glVertex2f( +1, +1 );

  •         glTexCoord2f( 1, 0 ); glVertex2f( +1, -1 );

  •     glEnd();

  •     glutSwapBuffers();

  • }

  • int main(int argc, char** argv)

  • {

  •     glutInit( &argc, argv );

  •     glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );

  •     glutCreateWindow(" Week08 ");

  •     glutDisplayFunc(display);

  •     id1 = myTexture("Diffuse.jpg");

  •     id2 = myTexture("bg.jpg");

  •     glEnable(GL_DEPTH_TEST);

  •     glutMainLoop();


  • }
///背景不卡住模型
  • #include <opencv/highgui.h>
  • #include <opencv/cv.h>
  • #include <GL/glut.h>
  • #include "glm.h"
  • GLMmodel*pmodel=NULL;
  • void
  • drawmodel(void)
  • {
  •     if (!pmodel) {
  • pmodel = glmReadOBJ("Gundam.obj");
  • if (!pmodel) exit(0);
  • glmUnitize(pmodel);
  • glmFacetNormals(pmodel);
  • glmVertexNormals(pmodel, 90.0);
  •     }

  •     glmDraw(pmodel, GLM_SMOOTH | GLM_TEXTURE);
  • }
  • GLuint id1, id2; ///TODO:增加2個 貼圖ID
  • int myTexture(char * filename)
  • {
  •     IplImage * img = cvLoadImage(filename); ///OpenCV讀圖
  •     cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
  •     glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
  •     GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
  •     glGenTextures(1, &id); /// 產生Generate 貼圖ID
  •     glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID
  •     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
  •     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
  •     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /// 貼圖參數, 放大時的內插, 用最近點
  •     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /// 貼圖參數, 縮小時的內插, 用最近點
  •     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
  •     return id;
  • }
  • float angle=0;
  • void display()
  • {
  •     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  •     glBindTexture(GL_TEXTURE_2D, id1);
  •     glPushMatrix();
  •         glRotatef(angle, 0,1,0);
  •         drawmodel();
  •     glPopMatrix();

  •     glBindTexture(GL_TEXTURE_2D, id2);
  •     glBegin(GL_POLYGON);
  •         glTexCoord2f( 0, 0 ); glVertex3f( +1, -1, +0.8);
  •         glTexCoord2f( 0, 1 ); glVertex3f( -1, +1, +0.8);
  •         glTexCoord2f( 1, 1 ); glVertex3f( +1, +1, +0.8);
  •         glTexCoord2f( 1, 0 ); glVertex3f( +1, -1, +0.8);
  •     glEnd();
  •     glutSwapBuffers();
  •     angle+=0.5;
  • }
  • int main(int argc, char** argv)
  • {
  •     glutInit( &argc, argv );
  •     glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
  •     glutCreateWindow(" Week013");
  •     glutDisplayFunc(display);
  •     glutIdleFunc(display);

  •     id1 = myTexture("Diffuse.jpg");
  •     id2 = myTexture("bg.jpg");
  •     glEnable(GL_DEPTH_TEST);
  •     glutMainLoop();
  • }

沒有留言:

張貼留言

Week18期末作業(橘貓的跳舞熊熊)

 期末作業(橘貓的跳舞熊熊) 影片: https://youtu.be/R89tptMaQZw 程式碼: #include <opencv/highgui.h> #include <opencv/cv.h> #include <GL/glut.h...