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





沒有留言:
張貼留言