2020年4月15日 星期三

欸你過來一下 8

今天老師提前跟我們說了期中考的題目
期中考考題如下:

///OpenGL必背10函式:拼字、大小寫不能錯
///參數要加,個數不能錯 ///中文註解,解釋意思
glPushMatrix();///備份矩陣
    glTranslatef(x,y,z);///位置
    glRotatef(angel,x,y,z);///旋轉角度
    glScalef(x,y,z);///放大縮小

    glBegin(GL_POLYGON);///開始畫
        glColor3f(r,g,b);///顏色
        glTexCoord2f(tx,ty);///貼圖座標
        glNormal3f(nx,ny,nz);///(打光)法向量
        glVertex2f(x,y);///頂點
    glEnd();///結束畫

glPopMatrix();///還原矩陣


今天要講的是打光
首先一樣先下載 ↓

打光在這裡 ↓
左上可以改變形狀
左下可以改材質

打光的程式碼好多好麻煩
只好學習偷竊技能(freeglut)
然後就...Do Re Me So------------------------------------


#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[] = { 5.0f, 105.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();
}


讓滑鼠變成光源

多撰寫一個函式即可(看一下圖片)
void motion(int x, int y)///motion函式,改light_position[]的值,呼叫函式
{
    light_position[0] = (x-150)/15.0;///光源的x座標
    light_position[1] = -(y-150)/15.0;///光源的y座標
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);///設定位置
    glutPostRedisplay();///重畫畫面
}

沒有留言:

張貼留言