2020年4月7日 星期二

茶壺的升級之路3

首先,我們先把上禮拜的反光茶壺用出來,(這是複習喔~!)我是直接用上禮拜的程式碼直接把他貼上。

#include <GL/glut.h>
///打光的第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);
    glutSolidTeapot( 0.3 );
    glutSwapBuffers();
}

/* Program entry point */

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("GLUT Shapes");
    glutDisplayFunc(display);


    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    ///打光1:要開啟光線, 原來範例就寫好了
    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    ///打光2:要設定光light的設定值 (前面有陣列,這裡拿來用
    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);
    ///打光2.2: 要把物體也設定好它的 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();

    return EXIT_SUCCESS;
}

接著,要讓茶壺移動,稍微加一些設定的的程式碼,就可以讓茶壺移動了。

#include <GL/glut.h>
///打光的第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 };

float teapotX=0, teapotY=0;///TODO1:
int oldX=0,oldY=0;///TODO1:
void mouse(int button,int state,int x,int y)
{///TODO1:mouse要可移動teapot Step1:按下去
    oldX=x;
    oldY=y;
}
void motion(int x,int y)///Step2: motion動
{
    teapotX += x-oldX;
    teapotY += y-oldY;
     oldX=x;
    oldY=y;
    glutPostRedisplay();///更新畫面
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///TODO1:
    glTranslatef(teapotX/250.0,teapotY/250.0,0);
    glutSolidTeapot( 0.3 );
    glPopMatrix();///TODO1:
    glutSwapBuffers();
}

/* Program entry point */

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("GLUT Shapes");
    glutDisplayFunc(display);
    glutMouseFunc(mouse);///TODO
    glutMotionFunc(motion);///TODO1


    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    ///打光1:要開啟光線, 原來範例就寫好了
    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    ///打光2:要設定光light的設定值 (前面有陣列,這裡拿來用
    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);
    ///打光2.2: 要把物體也設定好它的 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();

    return EXIT_SUCCESS;
}

接下來,要讓茶壺可以移動加轉動。這個時候就要加上可以設定旋轉的程式碼。
阿這個是要先按w,e才可以開始移動的喔~!


#include <GL/glut.h>
///打光的第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 };

int type=1;///TODO2: 1:rotate,2: translate
float teapotX=0, teapotY=0;///TODO1:
float teapotRotY=0;///TODO2:轉動的變數
int oldX=0,oldY=0;///TODO1:
void mouse(int button,int state,int x,int y)
{///TODO1:mouse要可移動teapot Step1:按下去
    oldX=x;
    oldY=y;
}
void motion(int x,int y)///Step2: motion動
{
    if(type==1){
        teapotRotY += x-oldX;
    }else if(type==2){///TODO2:移動
        teapotX += x-oldX;///TODO1
        teapotY += y-oldY;///TODO1
    }
     oldX=x;
     oldY=y;
    glutPostRedisplay();///更新畫面
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///TODO2:備份矩陣
    glTranslatef(teapotX/250.0,teapotY/250.0,0);
    glRotatef(teapotX,0,-1,0);///x方向的動 vs. y軸
    glutSolidTeapot( 0.3 );
    glPopMatrix();///TODO2:備份矩陣
    glutSwapBuffers();
}

void keyboard(unsigned char key,int x,int y)///TODO2:
{///沒有正負號,全部都當正的來用 0...255
    if(key=='e' || key=='E') type=1;///Maya:轉動1
    if(key=='w' || key=='W') type=2;///Maya:轉動2

}


int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("GLUT Shapes");

    glutDisplayFunc(display);
    glutMouseFunc(mouse);///TODO
    glutMotionFunc(motion);///TODO1
    glutKeyboardFunc(keyboard);///TODO2


    glEnable(GL_DEPTH_TEST);

    ///打光1:要開啟光線, 原來範例就寫好了
    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    ///打光2:要設定光light的設定值 (前面有陣列,這裡拿來用
    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);
    ///打光2.2: 要把物體也設定好它的 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();

    return EXIT_SUCCESS;
}

接下來要讓茶壺可以自由移動
為了瞭解
可以先去 http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/ 下載data,win32,glut32
然後把data跟wimdow解壓縮 ,再把data跟glut32丟到window資料夾中
了解原理後,就可以開始打程式碼了。
#include <GL/glut.h>
///打光的第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 };

int type=1;///TODO2: 1:rotate,2: translate
float teapotX=0, teapotY=0;///TODO1:
float teapotRotY=0;///TODO2:轉動的變數
int oldX=0,oldY=0;///TODO1:
void mouse(int button,int state,int x,int y)
{///TODO1:mouse要可移動teapot Step1:按下去
    oldX=x;
    oldY=y;
}
void motion(int x,int y)///Step2: motion動
{
    if(type==1){
        teapotRotY += x-oldX;
    }else if(type==2){///TODO2:移動
        teapotX += x-oldX;///TODO1
        teapotY += y-oldY;///TODO1
    }
     oldX=x;
     oldY=y;
    glutPostRedisplay();///更新畫面
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///TODO2:備份矩陣
    glTranslatef(teapotX/250.0,-teapotY/250.0,0);
    glRotatef(teapotRotY,0,-1,0);///x方向的動 vs. y軸
    glutSolidTeapot( 0.3 );
    glPopMatrix();///TODO2:備份矩陣
    glutSwapBuffers();
    teapotRotY++;///TODO3:每次多轉動1度
}

void keyboard(unsigned char key,int x,int y)///TODO2:
{///沒有正負號,全部都當正的來用 0...255
    if(key=='e' || key=='E') type=1;///Maya:轉動1
    if(key=='w' || key=='W') type=2;///Maya:轉動2

}


int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("GLUT Shapes");

    glutDisplayFunc(display);
    glutMouseFunc(mouse);///TODO
    glutMotionFunc(motion);///TODO1
    glutKeyboardFunc(keyboard);///TODO2
    glutIdleFunc(display);///TODO3: Idle閒閒的時候,就重畫


    glEnable(GL_DEPTH_TEST);

    ///打光1:要開啟光線, 原來範例就寫好了
    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    ///打光2:要設定光light的設定值 (前面有陣列,這裡拿來用
    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);
    ///打光2.2: 要把物體也設定好它的 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();

    return EXIT_SUCCESS;
}


今天的是最累的~我的眼睛好痛...





沒有留言:

張貼留言