2021年5月5日 星期三

week11

因晚到,所以直接跟著開始第二步

先去上課用軟體下載freeglut的檔案,並改好裡面需更改內容

還有下載source.zip,data.zipdata.zip 分別都解壓縮

把source裡面的glm.c和glm.h,transformation.c丟到week11的檔案裏面

打開transformation.c的程式用Edit With Notepad++打開

把裡面程式碼全部複製貼上codeblocks


glm.c改名glm.cpp  後在codeblocks左邊條列部分week11按右鍵add file 把glm.cpp加入

把 data.zip 裡的檔案解壓縮後 放入執行目錄桌面\freeglut-bin裡面


現在要親手打造20行程式碼

#include "glm.h" //要雙引號用同目錄的.h檔, 使用外掛

GLMmodel *pmodel=NULL;//使用指標pmodel

void drawmodel(void)

{

    if (!pmodel) {

pmodel = glmReadOBJ("data/porsche.obj");//porsche可以改成Al會變成人的模型

if (!pmodel) exit(0);

glmUnitize(pmodel);

glmFacetNormals(pmodel);

glmVertexNormals(pmodel, 90.0);

    }

    glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);

}

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    drawmodel();

    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc,argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week11 我的3D模型");


    glutDisplayFunc(display);

    glutMainLoop();

}


接下來要把物件打光
const GLfloat light_ambient[ ]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[ ]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[ ] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[ ] = { 2.0f, 5.0f, -5.0f, 0.0f };

const GLfloat mat_ambient[ ]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse [ ]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[ ]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[ ] = { 100.0f };
把上面打光的程式碼丟在int main上面
 glEnable(GL_DEPTH_TEST);//如果少了這行3D深度測試就會破圖
    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
上面的要丟在    glutMainLoop();上面

因為打光後發現圖片是背面的 我們要把模型轉方向

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(180,0,1,0);
        drawmodel();
   glPopMatrix();
    glutSwapBuffers();
}


現在要把模型換成鋼彈的
過程中出了點問題,所以這不是完整品彈有形狀了

老師後來給我們一個剛彈的直接程式碼



滑鼠按右鍵可以改變動作,按鍵盤的123等等數字可抵把身體部位消失。

沒有留言:

張貼留言

距地表面160 Week11

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