2022年3月29日 星期二

電腦圖學筆記Week06

 Week06

主題:打光

開啟的程式: Light Material.exe

(左上)左鍵按住拖曳可旋轉物體

(左上)右鍵,更換模型

(左下)右鍵,更換材質

[右邊的程式 glLightfv() => fv 為 float vector (陣列)

GLfloat light_pos[] = {-2.0, 2.0, 2.0, 1.0}; 陣列

glLightfv(GL_LIGHT0, GL_POSTION, 陣列)

                第幾個燈

                                 設定它的位置]

1.光的性質

(1)開啟CodeBlocks

(2)找到與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 };

---------------------------------------------------------------------------------------

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);

---------------------------------------------------------------------------------------

(3)今天的第一個程式碼

#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);

        glColor3f(1, 1, 0);

        glutSolidTeapot(0.3);

    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week06 Light");


    glutDisplayFunc(display);


    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-1)將上週的滑鼠函式加進去

#include <GL/glut.h>

#include <stdio.h>

float x=150, y=150, z=0, scale=1.0;

int oldX=0, oldY=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);

    glPopMatrix();

        glTranslatef((x-150)/150.0, -(y-150)/150.0, z);

        glScalef(scale, scale, scale);

        glColor3f(1, 1, 0);

        glutSolidTeapot(0.3);

    glPopMatrix();

    glutSwapBuffers();

}

void mouse(int button, int state, int mouseX, int mouseY)

{

    oldX=mouseX;

    oldY=mouseY;

}

void motion(int mouseX, int mouseY)

{

    if(mouseX-oldX>0) scale*=1.01;

    if(mouseY-oldY<0) scale*=0.99;

    oldX=mouseX;

    oldY=mouseY;

    display();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week06 Light");


    glutDisplayFunc(display);

    glutMouseFunc(mouse);

    glutMotionFunc(motion);


    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-2)完成上星期的程式並修改

#include <GL/glut.h>

#include <stdio.h>

float x=150, y=150, z=0, scale=1.0, angle=0.0;

int oldX=0, oldY=0;

void display()

{

    glClearColor(0.5, 0.5, 0.5, 1);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glTranslatef( (x-150)/150.0, -(y-150)/150.0, z);

        glRotatef(angle, 0, 1, 0);

        glScalef(scale, scale, scale);

        glColor3f(1,1,0);

        glutSolidTeapot(0.3);

    glPopMatrix();

    glutSwapBuffers();

}

void keyboard( unsigned char key, int mouseX, int mouseY)

{


}

void mouse( int button, int state, int mouseX, int mouseY)

{

    oldX = mouseX;

    oldY = mouseY;

}

void motion( int mouseX, int mouseY)

{

    angle+=(mouseX-oldX);

    ///if(mouseX-oldX > 0) scale*=1.01;

    ///if(mouseX-oldX < 0) scale*=0.99;

    ///x+=(mouseX-oldX);

    ///y+=(mouseY-oldY);

    oldX = mouseX;

    oldY = mouseY;

    display();

}

int main(int argc, char**argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("Week05 keyboard");


    glutDisplayFunc(display);

    glutKeyboardFunc(keyboard);

    glutMouseFunc(mouse);

    glutMotionFunc(motion);

    glutMainLoop();

}

(滑鼠拖曳可旋轉物體)

(3-3)最後的修改
#include <GL/glut.h>
#include <stdio.h>
float x=150, y=150, z=0, scale=1.0, angle=0.0;
int oldX=0, oldY=0, now=1;
void display()
{
    glClearColor(0.5, 0.5, 0.5, 1);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glTranslatef( (x-150)/150.0, -(y-150)/150.0, z);
        glRotatef(angle, 0, 1, 0);
        glScalef(scale, scale, scale);
        glColor3f(1,1,0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
void keyboard( unsigned char key, int mouseX, int mouseY)
{
    if(key=='1' || key=='w' || key=='W') now=1;
    if(key=='2' || key=='e' || key=='E') now=2;
    if(key=='3' || key=='r' || key=='R') now=3;
}
void mouse( int button, int state, int mouseX, int mouseY)
{
    oldX = mouseX;
    oldY = mouseY;
}
void motion( int mouseX, int mouseY)
{
    if(now==1)
    {
        x+=(mouseX-oldX);
        y+=(mouseY-oldY);
    }
    else if(now==2)
    {
        angle+=(mouseX=oldX);
    }
    else if(now==3)
    {
        if(mouseX-oldX>0) scale*=1.01;
        if(mouseY-oldY<0) scale*=0.99;
    }
    oldX = mouseX;
    oldY = mouseY;
    display();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week05 keyboard");

    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}
(透過滑鼠將物體進行移動、旋轉、縮放)












沒有留言:

張貼留言

VERY BEAUTIFUL, VERY POWERFUL

一.     一樣先安裝且設定好freeglut,OpecCV, 開啟CodeBlocks建立新專案 week11_gundam,                 把 MyGundam.zip下載解壓縮後的data資料夾放到freeglut/bin裡面 把week09_openc...