2024年3月28日 星期四

電腦圖學Week06

  1. Week06 期中考題目 https://jsyeh.org/gl/opengl_10_func.html

  2. #week06-0_sample
  3. 1.安裝freeglut,把lib\libfreeglut.a複製成libglut32.a
  4. 2.File-New-Project, GLUT專案
  5. 3.Ctrl-F 找程式碼 light "cpp
    1. glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS);
    2. glEnable(GL_LIGHTO); glEnable(GL_NORMALIZE); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHTING);
    3. glLightfv(GL_LIGHTO, GL_AMBIENT, light_ambient); glLightfv(GL_LIGHTO, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHTO, GL_SPECULAR, light_specular); glLightfv(GL_LIGHTO, GL_POSITION, light_position);
    4. 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);
    5.     glEnable(GL_DEPTH_TEST);
    6.     glDepthFunc(GL_LESS);

    7.     glEnable(GL_LIGHT0);
    8.     glEnable(GL_NORMALIZE);
    9.     glEnable(GL_COLOR_MATERIAL);
    10.     glEnable(GL_LIGHTING);

    11.     glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    12.     glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    13.     glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    14.     glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    15.     glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    16.     glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    17.     glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    18.     glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    19. const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
    20. const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
    21. const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
    22. const GLfloat high_shininess[] = { 100.0f };

  6. Week06-1_lighting 新的glut專案
    桌面安裝freeglut把lib的libfreeglut.a複製改名成libglut32.a
    File-NewProject,GLUT專案week04_mouse__glScalef
    貼上11行程式碼
    1. #include <GL/glut.h>
    2. void display()
    3. {
    4.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    5.     glutSolidTeapot(0.3);
    6.     glutSwapBuffers();
    7. }

    8. int main(int argc,char*argv[])
    9. {
    10.     glutInit(&argc,argv);
    11.     glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    12.     glutCreateWindow("week04 mouse glScalef");
    13.     glutDisplayFunc(display);

    14.     glutMainLoop();
    15. }
  7. 程式碼改成
    1. #include <GL/glut.h>
    2. void display()
    3. {
    4.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    5.     glutSolidTeapot(0.3);
    6.     glutSwapBuffers();
    7. }
    8. const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
    9. const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
    10. const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    11. const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };

    12. const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
    13. const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
    14. const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
    15. const GLfloat high_shininess[] = { 100.0f };
    16. int main(int argc,char*argv[])
    17. {
    18.     glutInit(&argc,argv);
    19.     glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    20.     glutCreateWindow("week06 lighting");
    21.     glutDisplayFunc(display);

    22.     glEnable(GL_DEPTH_TEST);
    23.     glDepthFunc(GL_LESS);

    24.     glEnable(GL_LIGHT0);
    25.     glEnable(GL_NORMALIZE);
    26.     glEnable(GL_COLOR_MATERIAL);
    27.     glEnable(GL_LIGHTING);

    28.     glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    29.     glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    30.     glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    31.     glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    32.     glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    33.     glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    34.     glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    35.     glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    36.     glutMainLoop();
    37. }


  8. 改第11行程式碼const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };
    從昏暗茶壺變亮

  9. 改第10行程式碼const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 0.0f, 1.0f };

  10. https://jsyeh.org/3dcg10/點開下載source和window.zip和data,zip
    解壓縮後把data資料夾放進window夾裡面
  11. 打開檔案Light Material 左上右鍵可以換物品 左下右鍵可以換材質

  12. Week06-2_lighting_glNormal3f 新的glut專案#include <GL/glut.h>
    1. float angle=0;
    2. void display()
    3. {
    4.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    5.     glPushMatrix();
    6.         glRotatef(angle++,0,1,0);
    7.         glBegin(GL_POLYGON);
    8.             glNormal3f(0,0,1);
    9.             glVertex2f(-1,-1);
    10.             glVertex2f(+1,-1);
    11.             glVertex2f(+1,+1);
    12.             glVertex2f(-1,+1);
    13.         glEnd();
    14.         glutSolidTeapot(0.3);
    15.     glPopMatrix();
    16.     glutSwapBuffers();
    17. }
    18. const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
    19. const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 0.0f, 1.0f };
    20. const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    21. const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };

    22. const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
    23. const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
    24. const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
    25. const GLfloat high_shininess[] = { 100.0f };
    26. int main(int argc,char*argv[])
    27. {
    28.     glutInit(&argc,argv);
    29.     glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    30.     glutCreateWindow("week06 lighting");
    31.     glutDisplayFunc(display);
    32.     glutIdleFunc(display);
    33.     glEnable(GL_DEPTH_TEST);
    34.     glDepthFunc(GL_LESS);

    35.     glEnable(GL_LIGHT0);
    36.     glEnable(GL_NORMALIZE);
    37.     glEnable(GL_COLOR_MATERIAL);
    38.     glEnable(GL_LIGHTING);

    39.     glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    40.     glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    41.     glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    42.     glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    43.     glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    44.     glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    45.     glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    46.     glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    47.     glutMainLoop();

    48. } 旋轉的茶壺
  1. week06-3_glm_obj_model 貼11行程式碼
    source裡有3個程式檔:transformation.c glm.h glm.c解壓縮
    要將專案做設定
    把glm.h放到桌面week06-3_glm_obj_model的目錄裡
    把glm.c放到桌面week06-3_glm_obj_model的目錄裡,改檔名glm.cpp
    在專案裡按右鍵 Add Files,加入glm.cpp
    然後再更改程式碼
    #include <GL/glut.h>
    #include "glm.h"
    GLMmodel* pmodel=NULL;
    void
    drawmodel (void)
    {
        if (!pmodel) {
        pmodel = glmReadOBJ ("data/Al.obj");
        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("week06 lighting");
        glutDisplayFunc(display);

        glutMainLoop();

    }

  2. week06-4_glm_obj_model_light_again 

沒有留言:

張貼留言