2023年4月6日 星期四

week08 余

   Week08 -1

因為我們比隔壁班多一堂課所以先教新進度

今天先去葉正聖老師的網站(https://jsyeh.org/3dcg10/)

下載data 跟windows

並解壓縮後將data拉近windows中

今天還要多下載一個source並解壓縮

了解3D模型如何產生的:

v對應vertex頂點

vt對應貼圖座標 g;TexCoord2f(tx,ty)

vn對應vertex normal法向量

f對應 面facet


選擇export selection

改成objexport檔

就可以在桌面開啟了



Week08-2

今天的第一個程式

新增一個glut專案檔名為week08-1_glm_model

把範例都刪掉

然後輸入下列程式碼開啟一個白色的茶壺

#include <GL/glut.h>

void display()

{

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glutSolidTeapot(0.3);

    glutSwapBuffers();

}

int main(int argc, char *argv[])

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

glutCreateWindow("week08");


glutDisplayFunc(display);

glutMainLoop();

}


上面再加入一行#include "glm.h"
要將sorce中的glm.h複製到和程式同一個資料夾
程式才可以執行
在專案裡右鍵-ADD-Files加入glm.cpp 
成功後左邊會有main.cpp glm.cpp




將3D模型.obj.mtl檔案放在{工作執行目錄}

C:\users\administrator\Desktop\freeglut\bin

#include <GL/glut.h>
#include "glm.h"
GLMmodel * pmodel=NULL;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    if(pmodel==NULL){
        pmodel=glmReadOBJ("10160421.obj");
        glmUnitize(pmodel);
    }
    glmDraw(pmodel,GLM_SMOOTH | GLM_MATERIAL);
    ///glutSolidTeapot(0.3);
    glutSwapBuffers();
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week08");

glutDisplayFunc(display);
glutMainLoop();
}
(因為我的模型是正方形所以是全白)

Weel08-3
在創建一個新專案檔名為week08-2_glm_model_texture
老師會傳給我們檔案(鋼蛋的模型)
然後用上第二節課的程式碼再稍微新增
#include <GL/glut.h>
#include "glm.h"
GLMmodel * pmodel=NULL;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    if(pmodel==NULL){
        pmodel=glmReadOBJ("Gundam.obj");
        glmUnitize(pmodel);
        glmFacetNormals(pmodel);
        glmVertexNormals(pmodel,90);
    }
    glmDraw(pmodel,GLM_SMOOTH | GLM_MATERIAL);
    ///glutSolidTeapot(0.3);
    glutSwapBuffers();
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week08");

glutDisplayFunc(display);
glutMainLoop();
}
就會出現老師的鋼蛋了

然後要新增貼圖
下載OPENCV用上週交的作法 並完成設定
程式碼如下
#include <GL/glut.h>
#include "glm.h"
#include <opencv/highgui.h>

#include <opencv/cv.h>

#include <GL/glut.h>

int myTexture(char * filename)
{

    IplImage * img = cvLoadImage(filename);

    cvCvtColor(img,img, CV_BGR2RGB);

    glEnable(GL_TEXTURE_2D);

    GLuint id;

    glGenTextures(1, &id);

    glBindTexture(GL_TEXTURE_2D, id);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

    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;

}
GLMmodel * pmodel=NULL;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    if(pmodel==NULL){
        pmodel=glmReadOBJ("Gundam.obj");
        glmUnitize(pmodel);
        glmFacetNormals(pmodel);
        glmVertexNormals(pmodel,90);
    }
    glmDraw(pmodel,GLM_SMOOTH | GLM_MATERIAL|GLM_TEXTURE);
    ///glutSolidTeapot(0.3);
    glutSwapBuffers();
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week08");
    myTexture("Diffuse.jpg");
glutDisplayFunc(display);
glutMainLoop();
}

就會出現有貼圖的鋼蛋了
完成~

最後在上傳到GITHUB
cd desktop
git clone https://github.com/dannyyu0521/2023graphicsb
cd 2023graphicsb
將檔案放入資料夾
git status
git add .
git status
git config --global user.email dannyyyu0521@gmail.com
git config --global user.name dannyyu0521
git commit -m "add week08"
git push

沒有留言:

張貼留言