2022年3月29日 星期二

鹿的電腦圖學筆記week06

 Step01:

1.下載Data,win32

2.windows.zip解壓縮

data.zip把data資料夾移入windows

主題:Light Material.exe

左上:左鍵=>drag旋轉

左上:右鍵=>切換模型

左下:右鍵=>切換Material



Step02:
1.用ctrl+f尋找const
2.保留

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


     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);
3.寫入
#include <GL/glut.h>
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);
    glutMainLoop();

}
4.把
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);
移到這2行程式中間
glutCreateWindow("week06_Light");
glutDisplayFunc(Display);
如下
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();

}
5.執行結果


Step03:
1.加入上週程式
float x=150,y=150,z=0,scale=1.0;
int oldx=0,oldy=0;
void keyboard(unsigned char key,int mouseX,int mouseY){

}
void mouse(int button,int key,int mouseX,int mouseY){
    oldx=mouseX;oldy=mouseY;
}
void motion(int mouseX,int mouseY){
    if(mouseX-oldx>0) scale*=1.01;
    if(mouseX-oldx<0) scale*=0.99;
    oldx=mouseX;oldy=mouseY;
    Display();
}
在Display()加入
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
2.執行結果


Step04_轉動:
1.設值angle=0;
2.Display()加入glRotatef(angle,0,1,0);
3.改寫motion()加入
angle+=(mouseX-oldx);   //轉動
註解//    if(mouseX-oldx>0) scale*=1.01;
        //    if(mouseX-oldx<0) scale*=0.99;
如下:
void motion(int mouseX,int mouseY){
    angle+=(mouseX-oldx);   //轉動
//    if(mouseX-oldx>0) scale*=1.01;
//    if(mouseX-oldx<0) scale*=0.99;
    oldx=mouseX;oldy=mouseY;
    Display();
}
4.執行結果

Step05:
1.設值int now=1;///1移動2轉動3縮放
2.修改motion()
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(mouseX-oldx<0) scale*=0.99;
    }

    oldx=mouseX;oldy=mouseY;
    Display();
}
3.在kerboard加入
    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;
4.執行結果
按1||w||W

按2|e||E



按3||r||R

















沒有留言:

張貼留言

VERY BEAUTIFUL, VERY POWERFUL

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