2017年4月17日 星期一

Week07 20170417 芷萱的課堂筆記

作業一:

前往http://jsyeh.org/3dcg10


1. data.zip按滑鼠右鍵另存新檔


 2. windows.zip按滑鼠右鍵另存新檔


3. glut32.dll按滑鼠右鍵另存新檔


4. sourse.zip













5. 將windows.zip解壓縮到桌面 →data.zip解壓縮到windows.zip資料夾
      →glut32.dll複製到windows.zip資料夾 →將Transformation點兩下

6.切換模型

7.開啟soccerball.obj→Notepad++ 按右鍵
  • v開頭   vertex
  • vn開頭 vertex normal
  • vt開頭  vertex texture coordinate
  • f開頭    face臉.面

作業二:  製作.匯出3D obj檔

1.先開啟Maya→建一個模型→Window/Setting/Preferences/Plug-in Manager 
2.objExport.mtl→將Auto load打勾

3.File→Export All...
4.將檔案類型改成OBJexport
5. 桌面上就會出現剛匯出的兩個檔案mtl檔和obj檔
作業三:
1.用老師的myGLMsample.zip解壓縮至桌面
     →開啟CodeBlocks→File/Open...
     →myGLMsample→04160011_hw1.cbp
2.Build and Run→跑出一台會轉動的保時捷
完整程式碼:
#include <string.h>
#include <stdlib.h>
#include <GL/glut.h>
#include "glm.h"
GLMmodel* pmodel = NULL;///一開始沒有讀入模型NULL
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        angle++;
        glRotatef(angle, 0,1,0);
        if (!pmodel) {///一開始如果空指標 那要很小心了 要讀入模型
        pmodel = glmReadOBJ("data/mushroom.obj");///檔名拼字目錄要對
        if (!pmodel) exit(0);///讀完還是沒有? 太糟了 失敗就閃退
        glmUnitize(pmodel);///如果沒有這行 可能太大或太小 看不到
        ///如果你的Maya有設定好全部的大小 那就不需要用glmUnitize();
        glmFacetNormals(pmodel);
        glmVertexNormals(pmodel, 90.0);
        }

        glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
    glPopMatrix();
    glutSwapBuffers();
}
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 };

int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB);
    glutCreateWindow("Yes, 3D Model Here");

    glutDisplayFunc(display);///顯示的函式
    glutIdleFunc(display);///閒閒的時候 也去顯示 剛好可讓angle++執行

    glClearColor(1,1,1,1);
    //glEnable(GL_CULL_FACE);///這兩行要刪掉 才能讓面正確顯示
    //glCullFace(GL_BACK);///這兩行要刪掉 才能讓面正確顯示
    
    glEnable(GL_DEPTH_TEST);///開啟 深度測試 3D功能
    //glDepthFunc(GL_LESS);///做深度測試時的函式 是用比大小的 小於LESS
    //剛好initial的值 就是GL_LESS
    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();///GLUT主要的迴圈
}

3.試著將自己做好的模型在CodeBlocks中顯示
    →先把作業二中匯出的兩個檔案放進myGLMsample資料夾/data中
4. 更改部分程式碼:
    pmodel = glmReadOBJ("data/porsche.obj");
    →改成pmodel = glmReadOBJ("data/mushroom.obj");
    即可出現會轉動的蘑菇

沒有留言:

張貼留言