2022年4月12日 星期二

一定是大拇指的啦

  step 0 :下載模型

0.0  jsyeh.org/3dcg10 下載  data.zip  , windows.zip

0.1 data.zip =>下載/windows/data

      windows.zip => 下載/windows

      source.zip=>下載/windows

      執行windows/LightMaterial.exe

  

step 1 : 複製程式碼 

1.1 開啟新專案,命名為week08_model ,複製程式碼到notepad++,存檔成.cpp

      讓字體變彩色好辨識

1.2從blogger的week06文章中複製light的程式碼並複製到week08_model

      打開會看到黃色的茶壺

 

 step 2 : 更名 、 放資料夾

2.1 source.zip裡面有三個程式 glm.h  glm.c. lightmaterial.cpp 

      拿裡面的程式來用 便能讀入3D模型

2.2 glm.h 要使用當標題檔

      glm.c 改名成glm.cpp  並加入到CodeBlock中的week08_model

2.3 將data放在desktop/freeglut/bin裡面

2.4 將glm.h 、 glm.cpp 放到week08_model資料夾中

 

 step 3 : 解釋 、 過程

3.1 #include <stdio.h>  /// < >是系統include裡的

3.2 #include "glm.h"  ///雙引號是同目錄裡的檔案

3.3 GLMmodel* pmodel = NULL  ///指標指到GLMmodel模型的指標


step 4 : 貼上程式碼

4.1貼上week06_light的程式碼

#include <GL/glut.h>

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 }; /// -5.0f是亮的 , 5.0是暗的


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

void display()///茶壺

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

        glColor3f(1,1,0);

        glutSolidTeapot(0.3);

    glutSwapBuffers();

}



int main(int argc, char **argv )

{

    glutInit( &argc , argv );

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );

    glutCreateWindow(" week06 light");


    glutDisplayFunc(display);

    ///留下的程式碼 , 要放在glutCreateWindow後才會有效

    glEnable(GL_DEPTH_TEST);

    glDepthFunc(GL_LESS);


    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()之前

    glutMainLoop();///否則卡在這裡,之後的程式,都不會執行到


}

4.2新增程式碼

#include "glm.h"

GLMmodel*pmodel=NULL;

void

drawmodel(void)

{

    if (!pmodel) {

pmodel = glmReadOBJ("data/soccerball.obj");///或是 data/data/soccerball.obj

if (!pmodel) exit(0);

glmUnitize(pmodel);

glmFacetNormals(pmodel);

glmVertexNormals(pmodel, 90.0);

    }

   glmDraw(pmodel, GLM_SMOOTH);

}///用來畫3d模型的程式碼

4.3將茶壺刪除後新增drawmodel ,完成最終程式碼

#include <GL/glut.h>

#include "glm.h"

GLMmodel *pmodel = NULL;

void

drawmodel(void)

{

    if(!pmodel) {

        pmodel=glmReadOBJ("data/data/soccerball.obj");

        if(!pmodel) exit(0);

        glmUnitize(pmodel);

        glmFacetNormals(pmodel);

        glmVertexNormals(pmodel,90.0);

    }

    glmDraw(pmodel,GLM_SMOOTH);

}

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 }; /// -5.0f是亮的 , 5.0是暗的


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

void display()///茶壺

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

        glColor3f(1,1,0);

        ///glutSolidTeapot(0.3);

        drawmodel();///執行上面drawmodel函式

    glutSwapBuffers();

}



int main(int argc, char **argv )

{

    glutInit( &argc , argv );

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );

    glutCreateWindow(" week06 light");


    glutDisplayFunc(display);

    ///留下的程式碼 , 要放在glutCreateWindow後才會有效

    glEnable(GL_DEPTH_TEST);

    glDepthFunc(GL_LESS);


    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()之前

    glutMainLoop();///否則卡在這裡,之後的程式,都不會執行到

}

step 5 : 最後程式流程 、 問題

5.1.用哪行程式碼 ? drawmodel()

5.2.檔案在哪裡 ? 要放在working dir工作目錄裡

5.3.在CodeBlocks下方藍色Build log說我們的工作目錄在...

5.4.將data放在desktop/freeglut/bin裡面

5.5.在source/裡找到glm.c和glm.h (詳細資料中點選附檔名顯示.c和.h)

5.6.將glm.c改成glm.cpp 

5.7.glm.cpp和glm.h放到CodeBlock中week08_model裡面

5.8.CodeBlocks裡面week8_model中add glm.cpp

5.9.執行完會有黃色足球

沒有留言:

張貼留言

VERY BEAUTIFUL, VERY POWERFUL

一.     一樣先安裝且設定好freeglut,OpecCV, 開啟CodeBlocks建立新專案 week11_gundam,                 把 MyGundam.zip下載解壓縮後的data資料夾放到freeglut/bin裡面 把week09_openc...