2022年3月28日 星期一

TC*(˙Ⱉ˙ฅ)​的學習日誌-week06

影片名稱:Ivan Sutherland (Sketchpad)
影片介紹:https://www.youtube.com/watch?v=6orsmFndx_o
了解電腦圖學的發展與介紹

課堂範例
老師的範例網址:https://jsyeh.org/3dcg10/






鍵盤操縱顯示座標

#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();
    return 0;
}

加入移動等操縱
#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();
    return 0;
}



移動的寫法
#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();///push備份矩陣
        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();///pop還原矩陣
    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 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();
    return 0;
}

學習縮放吧~
#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();///push備份矩陣
        ///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();///pop還原矩陣
    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 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_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week06 keyboard");

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

    glutMainLoop();
}


把鍵盤的功能加入,可讓茶壺進行移動或是縮放
#include <GL/glut.h>
#include <stdio.h>
float x=0,y=0,z=0,scale=1.0,oldx,oldy;
int now=1;///1.移動,2.旋轉,3.縮放
void display()
 {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///push備份矩陣
        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();///pop還原矩陣
    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 button, int state,int mousex,int mousey)
{
    oldx = mousex;  oldy = mousey;
}
void motion(int mousex,int mousey)
{

    if(now==1)
    {
        x += (mousex-oldx);///x移動的座標
        y += (mousey-oldy);///y移動的座標
    }
    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();
}
#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 Alpha沒用到
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///push備份矩陣
        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();///pop還原矩陣
    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 button, int state,int mousex,int mousey)
{
    oldx = mousex;  oldy = mousey;
}
void motion(int mousex,int mousey)
{
    if(now==1)
    {
        x += (mousex-oldx);///x移動的座標
        y += (mousey-oldy);///y移動的座標
    }
    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);
    glutInitWindowSize(500,500);///視窗的大小
    glutCreateWindow("Week06 keyboard");

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

    glutMainLoop();
}








沒有留言:

張貼留言