2019年3月28日 星期四

彥の圖學筆記 Week06

電腦圖學

2019-03-28 Week06

(1) 主題: 打光 Part1


每次上課必做,將我預先在moodle準備好的Examples: [data]、[win32]、glut32.dll
這三個檔案處理好的範例程式.zip檔 & freeglut下載下來 > 點開範例Light Material.exe
(這次需要多下載[source]範例程式碼!!)
程式碼(打光)

#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 }; 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); glutSolidTeapot(0.3); glutSwapBuffers(); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("06160955_Week06"); glutDisplayFunc(display); ///一堆 OpenGL 設定在這裡 glClearColor(1,1,1,1); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); 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(); }


(2) 主題: 模型 OBJ檔
程式碼(加入模型)

#include <GL/glut.h> #include "glm.h"///現在要有 3D Model 的第一行 GLMmodel* pmodel = NULL;///現在要有 3D Model 的第二行 ///這次新增的部分,打光的程式碼 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 }; ///以上 void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //glutSolidTeapot(0.3);
///現在要有 3D Model 的第三段 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); ///以上 glutSwapBuffers(); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("06160955_Week06"); glutDisplayFunc(display); ///一堆 OpenGL 設定在這裡 glClearColor(1,1,1,1); //glEnable(GL_CULL_FACE); glCullFace(GL_BACK); 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(); }


(3) 實作: GLM vs. OBJ


(4) 回家作業

這次的回家作業要做的是將自己做的MAYA模型匯入GLUT,
我結合了第五週所教的Rotate,再多新增Y軸的變數,
讓我可以使用滑鼠自由旋轉觀看我匯入的模型。

程式碼

#include <GL/glut.h>
#include "glm.h"///現在要有 3D Model 的第一行
GLMmodel* pmodel = NULL;///現在要有 3D Model 的第二行
float angleX=0, angleY=0;///今天新教的!!!!
///這次新增的部分,打光的程式碼
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 };
///以上
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    //glutSolidTeapot(0.3);
    glPushMatrix();///Push備份保護Matrix
        glRotatef(angleX, angleY, 1, 0);///今天新教的!!!! 對Y軸,轉angle度
        if (!pmodel) {///現在要有 3D Model
        pmodel = glmReadOBJ("D:/My Courses/大二課程/電腦圖學/Week06_HW/freeglut/bin/data/screen.obj");///現在要有 3D Model
        if (!pmodel) exit(0);///現在要有 3D Model
        glmUnitize(pmodel);///現在要有 3D Model
        glmFacetNormals(pmodel);///現在要有 3D Model
        glmVertexNormals(pmodel, 90.0);///現在要有 3D Model
        }///現在要有 3D Model
        glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);///現在要有 3D Model
    glPopMatrix();///Pop還原Matrix

    glutSwapBuffers();
}
void motion(int x, int y)///現在要新加的!!!!
{///當你的mouse去drag作motion動作時,
    angleX=x;///現在要新加的!!!!
    angleY=y;
    display();///現在要新加的!!!!
}
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("06160955_Week06");

    glutDisplayFunc(display);

    ///一堆 OpenGL 設定在這裡
    glClearColor(1,1,1,1);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    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);
    ///以上
    glutIdleFunc(display);///今天新教的!!!! Idle閒閒沒事,就重畫
    glutMotionFunc(motion);///現在要新加的!!!!

    glutMainLoop();
}

沒有留言:

張貼留言