2022年3月28日 星期一

XC week06上課筆記

 1.介紹電腦圖學之父 伊凡·愛德華·蘇澤蘭 (Ivan Edward Sutherland)

    出生:生於美國內布拉斯加州黑斯廷斯,計算機科學家,被認為是「計算機圖形學之父」[1]。因發明Sketchpad,拓展了計算機圖形學的領域,為1988年圖靈獎得主。

    生平:卡內基技術學院(今卡內基梅隆大學)取得學士學位,於加州理工學院取得碩士。1963年,在麻省理工學院取得計算機工程博士學位。他在博士論文中提出的Sketchpad程式,被認為是計算機圖形學的一大突破。

1962年,他著手進行自己的博士論文,在麻省理工學院開始創作Sketchpad程式。克勞德·夏農同意擔任他的指導教授,馬文·閔斯基等人也參與指導。

2.看課本範例

    1.https://jsyeh.org/3dcg10/下載 WIN32跟data.zip後解壓縮,並把data丟進去windows裡面,並執行Transformation.exe

    2.在下面按下滑鼠右鍵 Swap translate/rotate ,讓物件公轉/自轉


    3.從上禮拜的部落格中,複製上周的程式並加上

    void keyboard( unsigned char key, int x, int y)
    {
        printf("現在按下:%c 座標在:%d %d\n", key, x, y);
    }
    完整程式碼如下:
    #include <GL/glut.h>
    #include <stdio.h>
    void display()
    {
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
            glColor3f( 1, 1, 0);
            glutSolidTeapot(0.3);
        glutSwapBuffers();
    }
    void keyboard( unsigned char key, int x, int y)
    {
        printf("現在按下:%c 座標在:%d %d\n", key, x, y);
    }
    int main(int argc, char**argv)
    {
        glutInit( &argc, argv );
        glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
        glutCreateWindow("week06 keyboard");

        glutDisplayFunc( display );
        glutKeyboardFunc(keyboard);
        glutMainLoop();
    }

4.加入Mouse, Motion函式

    #include <GL/glut.h>
    #include <stdio.h>
    float x=0, y=0, z=0, oldX, oldY;
    void display()
    {
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
            glTranslatef( (x-150)/150.0, -(y-150)/150.0, z);
            glColor3f( 1, 1, 0);
            glutSolidTeapot(0.3);
        glPopMatrix();
        glutSwapBuffers();
    }
    void keyboard( unsigned char key, int x, int y)
    {
        printf("現在按下:%c 座標在:%d %d\n", key, x, y);
    }
    void mouse( int botton, int state, int mouseX, int mousY)
    {
        oldX = mouseX; oldY = mouseY;
    }
    void motion(int mouseX, int mousY)
    {
        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("week06 keyboard");
    
        glutDisplayFunc( display );
        glutKeyboardFunc(keyboard);
        glutMouseFunc(mouse);
        glutMotionFunc(motion);
        glutMainLoop();
    }

5.用滑鼠使茶壺變大
#include <GL/glut.h>
#include <stdio.h>
float x=0, y=0, z=0, scale=1.0, oldX, oldY;
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glPushMatrix();
        //glTranslatef( (x-150)/150.0, -(y-150)/150.0, z);
        glScaled( scale, scale, scale );
        glColor3f( 1, 1, 0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
void keyboard( unsigned char key, int x, int y)
{
    printf("現在按下:%c 座標在:%d %d\n", key, x, y);
}
void mouse( int botton, int state, int mouseX,int mouseY)
{
    oldX = mouseX; oldY = mouseY;
}
void motion(int mouseX, int mouseY)
{
    if(mouseX>oldX )scale= scale * 1.01;
    if(mouseX<oldX )scale= 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("week06 keyboard");

    glutDisplayFunc( display );
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}

6.修改第五篇的程式碼使其切換模式


#include <GL/glut.h>
#include <stdio.h>
float x=0, y=0, z=0, scale=1.0, angle=0.0, oldX, oldY;
int now=1;
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glPushMatrix();
        glTranslatef( (x-150)/150.0, -(y-150)/150.0, z);
        glScaled( scale, scale, scale );
        glRotatef( angle, 0, 0, 1);
        glColor3f( 1, 1, 0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
void keyboard( unsigned char key, int x, int y)
{
    //printf("現在按下:%c 座標在:%d %d\n", key, x, y);
    if(key=='w'|| key=='W')now=1;
    if(key=='e'|| key=='E')now=2;
    if(key=='r'|| key=='R')now=3;

}
void mouse( int botton, 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==3){
        if(mouseX>oldX ) scale= scale * 1.01;
        if(mouseX<oldX ) scale= scale * 0.99;
    }
    oldX = mouseX; oldY = mouseY;
    display();
}
int main(int argc, char**argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("week06 keyboard");

    glutDisplayFunc( display );
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}

7.使其增加選轉模式並更新背景顏色

#include <GL/glut.h>
#include <stdio.h>
float x=250, y=250, z=0, scale=1.0, angle=0.0, oldX, oldY;
int now=1;
void display()
{
    glClearColor(0.5, 0.5, 0.5, 1);
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glPushMatrix();
        glTranslatef( (x-250)/250.0, -(y-250)/250.0, z);
        glRotatef( angle, 0, 0, 1);
        glScaled( scale, scale, scale );
        glColor3f( 1, 1, 0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
void keyboard( unsigned char key, int x, int y)
{
    //printf("現在按下:%c 座標在:%d %d\n", key, x, y);
    if(key=='w'|| key=='W')now=1;
    if(key=='e'|| key=='E')now=2;
    if(key=='r'|| key=='R')now=3;

}
void mouse( int botton, 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 ) scale= scale * 1.01;
        if(mouseX<oldX ) scale= scale * 0.99;
    }
    oldX = mouseX; oldY = mouseY;
    display();
}
int main(int argc, char**argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutInitWindowSize(500, 500);
    glutCreateWindow("week06 keyboard");

    glutDisplayFunc( display );
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}











沒有留言:

張貼留言