2021年5月19日 星期三

yun_電腦圖學筆記week13

  • 今天老師開始使用遠距教學
    0.1. freeglut 有裝成功

  • 0.2. OpenCV 有裝正確, 設定

  • C:\OpenCV2.1\include
  • C:\OpenCV2.1\lib

  • cv210 cxcore210 highgui210


  • 1. 先讓貼圖成功


  • 1.1. hackmd.io/@jsyeh/opengl 有 貼圖範例程式
  • #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("puipui.jpg"); id2 = myTexture("bg.jpg"); glEnable(GL_DEPTH_TEST); glutMainLoop(); }
  • 1.2. Fiile-New-Project, GLUT專案 week13_robot (把main.cpp內容備份)
    1.3. 把貼圖範例程式 放入 main.cpp (把 puipui.jpg 改成 Diffuse.jpg)


  • 1.4. 把圖檔放好 桌面/freeglut/bin  有 Diffuse.jpg bg.jpg (Teams裡)

    2. 讓目錄正確 (因桌面/freeglut/bin 太怪了。要改到 專案目錄week13_robot)
    2.1. 把 freeglut\bin 的 freeglut.dll copy到專案目錄 week13_robot
  •        把 Diffuse.jpg 及 bg.jpg 移到專案目錄 week13_robot


  • 2.2. 用 Notepad++ (快裝) 把 week13_robot\week13_robot.cbp 專案檔打開
           兩個working_dir 要改成 "."  再存檔
  • 2.3. CodeBlocks會出現 Reload畫面, 設好它

    按確定就好
    3. glm模式
    3.1. 檔案準備好 source.zip (glm.h glm.cpp(改), transformation.c)



  • 3.2. 模型準備好 gundam還沒切開.zip 裡有 Gundam.obj Gundam.mtl Diffuse.jpg 


  • 都移動到專案資料夾裡面
    3.3. 要加入程式 (在week13_robot 專案中, Add 把 glm.cpp 加入)



  • 3.4. 用 Notepad++ 開 transformation.c 要偷裡面的程式       
  • #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_MATERIAL); }

  • 再 copy drawmodel() 的函式, 改glmReadOBJ("檔名") 及 改右邊 glmDraw(... GLM_TEXTURE) ,

  •  


  • 並在 display()裡叫 drawmodel()



  • 3.5. 圖檔Diffuse.jpg看起來需要上下反過來, 可用小畫家幫忙,存檔後再執行即可

  • 用垂直翻轉




  • 4. 旋轉
    4.1. 先整體旋轉 glPushMatrix(); glRotatef(角度, 0,1,0); 畫圖; glPopMatrix();

  • glPushMatrix();
    glRotatef(angle,0,1,0);
    drawmodel();///glutSolidTeapot(0.3);
    glPopMatrix();
  • 4.2. 背景的圖,移一下

    5. T-R-T
    5.1. 先把(許多小)模型準備好 body.obj body.mtl, arm1.obj arm1.mtl, arm2.obj arm2.mtl...


  • 也移動到專案內
    5.2. 把 GLMmodel * body = NULL 等都加上許多指標 (body, arm1, arm2)

  • GLMmodel* pmodel = NULL; GLMmodel* arml = NULL; GLMmodel* arm2 = NULL; GLMmodel* handl = NULL;
  • 改程式碼


  • 5.3. glmReadOBJ(), glmDraw(); (還沒教到)

沒有留言:

張貼留言

距地表面160 Week11

 #include "glm.h" GLMmodel* pmodel = NULL; void drawmodel(void) {     if (!pmodel) { pmodel = glmReadOBJ("data/porsche.obj...