2024年3月25日 星期一

fangg week06

 #week06


打光


##week06-0_sample_code

20行程式:

```cpp

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


   (2行) glEnable(GL_DEPTH_TEST);

    glDepthFunc(GL_LESS);


    (12行)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);

```

##week06-1_lighting

1.先貼上11行 GLUT程式
2.再把剛剛的20行貼上
3.繪畫出很立體的茶壺
  
  glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
老師另外打了這兩行在最後display後

11行程式:
#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_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week06 lighting");

    glutDisplayFunc(display);
    glutMainLoop();
}


這行程式 可改光線位置


##week06-2_lighting_glNormal3f

1.貼上剛剛的week06-1程設

2.要把茶壺變成正方形

4.加上mouse轉動

```

    glPushMatrix();

        glRotatef(angle++, 0, 1, 0);

        glScalef(0.8,0.8,0.8);

        glBegin(GL_POLYGON);

            glNormal3f(0,0,1);

            glVertex2f(-1,-1);

            glVertex2f(+1,-1);

            glVertex2f(+1,+1);

            glVertex2f(-1,+1);

        glEnd();

    glPopMatrix();

```

最下一層 display 再加一行: glutIdleFunc(display);



##week06-3_glm_obj_model


3.1 #include "glm.h"

3.2 GLMmodel* pmodel = NULL;

3.3 讀模型、畫模型

cpp```

void

drawmodel(void)

{

    if (!pmodel) {

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

if (!pmodel) exit(0);

glmUnitize(pmodel);

glmFacetNormals(pmodel);

glmVertexNormals(pmodel, 90.0);

    }


    glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);

}

```

4.1 glm.h 放到week06-4_glm_obj_model 目錄裡

4.2 glm.c 放到week06-4_glm_obj_model目錄裡,改檔名成 glm.cpp

4.3 對著專案按右鍵,新增檔案,將glm.cpp加入專案



4.4 將data 資料夾,複製到 freeglut\bin 執行目錄裡

4.5 把glutSoildTeapot(0.3); 換成drawmodel();


可在data裡選 不同種模型

畫出不同種模型



沒有留言:

張貼留言