2022年6月26日 星期日

VERY BEAUTIFUL, VERY POWERFUL

一.

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

data.zip =>下載/windows/data

      windows.zip => 下載/windows

      source.zip=>下載/windows

      執行windows/LightMaterial.exe


二.

    開啟一個新專案,命名為week08_model,從week06_light複製到這周的main.cpp

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

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

2. 

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

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

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

///

#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();///否則卡在這裡,之後的程式,都不會執行到


}

///


三.

新增以下程式碼

///

#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模型的程式碼

///

將茶壺刪掉後新增程式碼,完成今天的程式碼

///

#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();///否則卡在這裡,之後的程式,都不會執行到

}

沒有留言:

張貼留言

VERY BEAUTIFUL, VERY POWERFUL

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