2022年5月2日 星期一

熱血小葉老師的圖學筆記 Week11

# Week11


## step01-1


1. 安裝 freeglut (1) libglut32.a (2) freeglut\bin

2. 安裝 OpenCV 2.1 (上週) 小心! Add PATH (其實就是 .dll 檔案)

3. (要重開)File-New-Project, GLUT專案 week11_gundam

4. 下載 jsyeh.org/3dcg10 的 source.zip 裡面 glm.h glm.c

5. 把 glm.h glm.cpp 放到 week11_gundam 專案 目錄 (main.cpp的鄰居)

6. myGundam.zip 的模型裡的 data\模型檔,放到 工作 目錄 freeglut\bin


講解意思:

1. compiler include .h 目錄

2. linker lib .lib 目錄

3. linker 咒語 要加入的檔案 一堆 .lib 檔

而 bin 裡的 .dll 檔案,是在 "工作執行目錄"


## step01-2

寫程式,先複習第09週的程式(貼圖)

1. 貼上你的程式

2. 配上你的咒語,只要寫一次就好

3. 咒語 Setting-Compiler-Search directories: Compiler include 目錄 C:\OpenCV2.1\include

4. 咒語 Setting-Compiler-Search directories: Linker lib 目錄 C:\OpenCV2.1\lib

5. 咒語 Setting-Compiler-Linker: cv210 cxcore210 highgui210

6. 執行可成功, 代表: (1) OpenCV的咒語設對了, (2) PATH 也對了, (3) 你的 gundam 的 data 也對了


```cpp

///當上面是彩色的,表示現在是可執行

///左邊的Projects裡的 week11_gundam 按右鍵 Add Files

#include <opencv/highgui.h>

int main()

{

IplImage * img = cvLoadImage("data/Diffuse.jpg");

cvShowImage("week11", img);

cvWaitKey(0);//等任意鍵繼續

}

```


## step02-1

接續前面的專案,將 myTexture加到前面, 將 10行GLUT程式加到後面, 配上呼叫 myTexture(圖檔) 便可以看到 teapot 穿上 Diffuse的貼圖


1. 把 myTexture 放到程式的前面

2. 把 10行 GLUT 程式放進去

3. 在 main() 的 glutMainLoop()之前 myTexture("data/Diffuse.jpg");

4. 我們就可看到 teapot穿上 gundam 的 Diffuse貼圖



```cpp

#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可

#include <opencv/cv.h>

#include <GL/glut.h>

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;

}  

```


## step02-2

step02-2_接續前一個案案,接下來是要將 glm 模型相關的程式拿來用。最後可以看到 Gundam模型哦!



把 glm 模型相關的程式 貼出來

1. `#include "glm.h" //使用同目錄中的 glm.h 外掛`

2. `GLMmodel * pmodel = NULL;`

3. display()裡面, 要有畫模型的程式


```cpp

#include "glm.h"

GLMmodel * pmodel = NULL;

```


在 display()裡面

```cpp

void display()

{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

if( pmodel == NULL ){///程式放這裡

pmodel = glmReadOBJ( "data/gundam.obj" ); ///讀入模型

glmUnitize( pmodel ); ///把模型pmodel 調整成單位大小 -1...+1

glmFacetNormals( pmodel ); ///把Facet面的法向量Normals算出來

glmVertexNormals( pmodel , 90 ); ///把 Vertex的法向量,用面平均算出來,超過90度就分開

}

glmDraw(pmodel, GLM_TEXTURE);

glutSwapBuffers();

}

```


## step02-3

剛剛看到3D模型,很開心。細看之後, 發現模型的貼圖好像上下倒過來了。所以 data目錄中的 Diffuse.jpg 圖檔需要「上下垂直翻轉」。


而且看起來,好像模型被壓扁了, 我們需要開啟 3D的功能!!



1. 利用小畫家,把 freeglut\bin\data\Diffuse.jpg 開起來, 上下「垂直翻轉」

2. 在 glutMainLoop()之前(可以讀圖,可以myTexture(), 可以打光, 可以做很多設定) 加 glEnable(GL_DEPTH_TEST); 開啟 3D深度測試功能,讓近的會蓋掉遠的,便是真3D

3. 我們想讓3D模型轉起來 glPushMatrix() ... glPopMatrix() 的中間,加上 glRotatef(angle, 0,1,0); 配上 angle+=1

4. 最後,加入 glutIdleFunc( display ) 有空就重畫畫面


```cpp

#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可

#include <opencv/cv.h>

#include <GL/glut.h>

#include "glm.h"

GLMmodel * pmodel = NULL;

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);


if( pmodel == NULL ){///程式放這裡

pmodel = glmReadOBJ( "data/hand1.obj" ); ///讀入模型

glmUnitize( pmodel ); ///把模型pmodel 調整成單位大小 -1...+1

glmFacetNormals( pmodel ); ///把Facet面的法向量Normals算出來

glmVertexNormals( pmodel , 90 ); ///把 Vertex的法向量,用面平均算出來,超過90度就分開

}


glPushMatrix();

        glRotatef(angle, 0,0,1);

        glScalef(2,2,2);

        glmDraw(pmodel, GLM_TEXTURE);

    glPopMatrix();

glutSwapBuffers();

angle+=1;

}

int main(int argc, char**argv)

{

    glutInit( &argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week11 gundam");


    glutDisplayFunc(display);

    glutIdleFunc(display);

    myTexture("data/Diffuse.jpg");

    glEnable(GL_DEPTH_TEST);


    glutMainLoop();

}

```


## step03-0

老師講些故事, 鼓勵大家多練習、把握學習的機會。

- 蘇文鈺老師 [教真的,如果師父不狠心一點,徒弟是學不會的。](https://www.facebook.com/arwen.su.5/posts/2344128725740718)


## step03-1


利用Autodesk Maya 來切割3D模型、匯出 OBJ模型檔。老師介紹老師拍的影片給大家參考

- https://www.youtube.com/watch?v=D4a7cNFF9kQ

- 如何使用 Maya 匯出 3D模型檔(OBJ) 觀看次數:11,717次

## step03-2

本來老師想要示範 T-R-T 的程式, 不過後來發現快下課了, 時間不夠,就下週再教


## step03-3

最後老師再示範「如何利用Git指令,將今天的程式上傳」其中比較重要的,如果電腦之前有 git clone 過,就可以不用再做這一步, 只要記得在目錄中 git pull 把雲端先拉下來同步。另外如果 git config 做過, 也可以不用做。只要檔案修改後, git pull, git add ., git commit -m, 最後 git push 即可

 

沒有留言:

張貼留言