2023年4月19日 星期三

Cold Talker Week10 3D模型

 STEP01

1.至https://jsyeh.org/3dcg10/下載上課用的模型檔案,解壓縮並執行



2.看obj檔案裡對照期中考試的10行程式碼,v對應頂點,vt對應貼圖座標,vn對應打光的法向量,f是點線面的面

STEP02

1.再到https://jsyeh.org/3dcg10/下載source

2.CodeBlock開啟新專案,命名為weekl0_glm

3.把sourse裡的glm.h放到week10_glm的資料夾裡

4.把glm.c改成glm.cpp(改副檔名),也加入week10_glm的資料夾

5.左邊彩色方塊右鍵,add file,把glm.cpp加入到專案內

6.把windows裡的模型檔,複製到工作執行目錄(Build log會顯示)

7.最後把模型檔畫出來

STEP03

1.複製之前畫茶壺的10行程式碼

2.標頭檔加上#include "glm.h"

3.GLMmodel * pmodel = NULL;給一個模型的指標,先是空的

4.把畫茶壺那行拿掉,(此以Al為範例)換成:

if (pmodel==NULL) {

pmodel = glmReadOBJ("Al(檔名).obj");

glmUnitize(pmodel);

glmFacetNormals(pmodel);

glmVertexNormals(pmodel, 90);

}

glmDraw(pmodel, GLM_MATERIAL);

得到結果,如圖:
STEP04

1.建立新專案,命名為Week10_gundam

2.複製Week10_glm的程式碼過來

3.照前一個的方式把glm.cpp加入專案,把鋼彈的Diffuse.jpg,Gundam.obj,Gundam.mtl加入工作執行目錄
4.為了貼圖,到葉正聖老師上課軟體下載openCV,詳請見Week07,設定好後重開CodeBlocks

5.設定咒語,見第七周

6.到https://gist.github.com/jsyeh懷著感恩的心複製myTexture,貼到專案裡

7.程式碼如下:
#include <GL/glut.h>
#include "glm.h"
GLMmodel * pmodel = NULL;
#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;
}
void display()

{

if (pmodel==NULL) {
pmodel = glmReadOBJ("Gundam.obj");
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90);
}
glmDraw(pmodel, GLM_MATERIAL | GLM_TEXTURE);

glutSwapBuffers();
}
int main(int argc, char *argv[])
{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

glutCreateWindow("Week10");

glutDisplayFunc(display);
myTexture("Diffuse.jpg");//呼叫myTexture

glutMainLoop();

}

執行結果:
得到一尊上色怪怪的鋼彈(經過將Diffuse.jpg上下顛倒,上色變正常)

STEP05 老師送的會轉的鋼彈

#include <GL/glut.h>
#include "glm.h"
GLMmodel * pmodel = NULL;
#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;
}
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//glutSolidTeapot( 0.3 );
if (pmodel==NULL) {
pmodel = glmReadOBJ("Gundam.obj");
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90);
}
glPushMatrix();
glRotatef(angle, 0, 1, 0);
glmDraw(pmodel, GLM_MATERIAL | GLM_TEXTURE);
    glPopMatrix();
    angle++;
glutSwapBuffers();
}
int main(int argc, char *argv[])
{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

glutCreateWindow("Week10");

glutDisplayFunc(display);
glutIdleFunc(display);
myTexture("Diffuse.jpg");
glEnable(GL_DEPTH_TEST);

glutMainLoop();

}







沒有留言:

張貼留言