2020年4月15日 星期三

2020/04/15-天氣晴

Week08

1.期中考考題:OpenGL必背的10個函數(拼字不能拼錯&要有中文註解)
///OpenGL必背10函式:拼字大小寫不能寫錯
///參數要加(前面幾個浮點樹後面就要有相對應參數數量),個數不能錯,中文註解解釋意思
glPushMatrix();///備份矩陣
    glTranslatef(x,y,z);///移動
    glRotatef(angle,x,y,z);///轉動
    glScalef(x,y,z);///放大縮小
 
    glBegin(GL_POLYGON);///開始畫
        glColor3f(r,g,b);///顏色
        glTexCoord2f(tx,ty);///貼圖座標
        glNormal3f(nx,ny,nz);///打光法向量
        glVertex2f(x,y);///頂點數,也可glVertex3f(x,y,z);
    glEnd();///結束畫
glPopMatrix();///還原矩陣



2.試玩打光
http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/
進到上面網址,下載data/win32/glut32.dll
點進Light Material.exe進入試用畫面



3.從專案檔裡找尋我們要用到的程式碼並將其剪貼下來
Ctrl+F尋找light
第一個找到的:
///陣列宣告,有光的值
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 };
///material的值
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 };



glEnable(GL_DEPTH_TEST);///記得複製這行
    ///打開第一個燈光
    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);
    ///material的設定值
    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);


4.利用複製過來的程式完成打光程式
#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 };
///material的值
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("Week08 light");

    glutDisplayFunc(display);
    ///裡面要有打光設定的函式
    glEnable(GL_DEPTH_TEST);///開啟3D的深淺深度測試=>近的蓋掉遠的
    ///打開第一個燈光
    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);
    ///material的設定值
    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();
}

5.利用mouse motion改變光源位置

#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 };
GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };///const表示不能動的變數,直接給他刪掉
///material的值
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 motion(int x,int y)
{
    light_position[0]=(x-150)/15.0;///光源的x座標
    light_position[1]=-(y-150)/15.0;///光源的y座標
    glLightfv(GL_LIGHT0,GL_POSITION,light_position);///設定位置
    glutPostRedisplay();///重畫畫面
}

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("Week08 light");

    glutDisplayFunc(display);
    ///裡面要有打光設定的函式
    glEnable(GL_DEPTH_TEST);///開啟3D的深淺深度測試=>近的蓋掉遠的
    ///打開第一個燈光
    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);
    ///material的設定值
    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);

    glutMotionFunc(motion);///呼叫函式

    glutMainLoop();
}



6.三種光源介紹:Ambient/Diffuse/Specular(所有光都是這三種相輔相成)

Ambient:無所不在的光(環境照明)
即使沒有給特定光源,但總會有一些光透過折射/反射/散射等方式存在
並照到物體,因此物體不會完全黑暗

Diffuse:角度光(漫射照明)
模擬燈光對物體的方向性影響

Specular:特別的光(鏡面照明)
模擬出現在閃亮物體上的光點

沒有留言:

張貼留言