2022年3月28日 星期一

涵030 week06 筆記

 第一節課:

觀看電腦圖學之父的影片

06-0


下方右鍵 Swap Translate/Rotate

自轉&公轉

完成程式碼五步驟

06-1


按按鍵,出現座標
程式碼如下:
(黃色螢光代表這次新增的)


#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_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week06_keyboard");

     glutDisplayFunc(display);
     glutKeyboardFunc(keyboard);

     glutMainLoop();

}


06-2(未完成)




程式碼如下:
(黃色螢光代表這次新增的)

#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);
}
void mouse( int button, int state, int x, int y )
{

}
void motion( int x, int y )
{

}
int main(int argc, char *argv[] )
{

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week06_keyboard");

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

     glutMainLoop();

}

06-3(未完成)

#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);
     glPushMatrix();
     glTranslatef((x-150)/150.0,-(y-150)/150.0, z );///Maya: w
     ///glRotatef( angle, 0, 0, 1);
     ///glScalef( scale, scale,scale);
        glColor3f(1,1,0);///修改顏色
        glutSolidTeapot(0.3);///修改物品
    glPopMatrix();
    glutSwapBuffers();
}
void keyboard( unsigned char key, int mouseX, int mouseY )
{
    printf("現在按下:%c 座標在:%d %d\n", key, mouseX, mouseY);
}
void mouse( int button, int state, int mouseX, int mouseY )
{
    oldX = mouseX; oldY = mouseY;
}
void motion( int mouseX, int mouseY )
{
    x += (mouseX-oldX);
    y += (mouseY-oldY);
    oldX = mouseX; oldY = mouseY;
    display();
}
int main(int argc, char *argv[] )
{

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week06_keyboard");

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

     glutMainLoop();

}

06-4(未完成縮放) 

程式碼:
(黃色螢光代表這次新增的)


#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 );///Maya: w
     ///glRotatef( angle, 0, 0, 1);
     glScalef( scale, scale,scale);///Maya: r
        glColor3f(1,1,0);///修改顏色
        glutSolidTeapot(0.3);///修改物品
    glPopMatrix();
    glutSwapBuffers();
}
void keyboard( unsigned char key, int mouseX, int mouseY )
{
    printf("現在按下:%c 座標在:%d %d\n", key, mouseX, mouseY);
}
void mouse( int button, 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;
    oldX = mouseX; oldY = mouseY;
    display();
}
int main(int argc, char *argv[] )
{

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week06_keyboard");

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

     glutMainLoop();

}

06-5(未完成旋轉)

06-6(完成!!!)

完整程式碼如下:

#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;///1移動2旋轉3縮放
void display()
{
    glClearColor(0.5, 0.5, 0.5, 1);///用來Clear色彩 R、G、B、A
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     glPushMatrix();
     glTranslatef((x-250)/250.0,-(y-250)/250.0, z );///Maya: w
     glRotatef( angle, 0, 0, 1);///Maya: e
     glScalef( scale, scale,scale);///Maya: r
        glColor3f(1,1,0);///修改顏色
        glutSolidTeapot(0.3);///修改物品
    glPopMatrix();
    glutSwapBuffers();
}
void keyboard( unsigned char key, int mouseX, int mouseY )
{
    //printf("現在按下:%c 座標在:%d %d\n", key, mouseX, mouseY);
    if(key=='w' || key=='W') now=1;///移動
    if(key=='e' || key=='E') now=2;///旋轉
    if(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 )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_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week06_keyboard");

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

     glutMainLoop();

}

1.為什麼150變成250?    因為原本是(300,300)後變成(500,500)
上面變視窗大小的主要程式碼為: glutInitWindowSize






沒有留言:

張貼留言