2022年3月28日 星期一

09160111week06

 1-1

電腦圖學之父Ivan Sutherland的影片介紹

https://www.youtube.com/watch?v=6orsmFndx_o


1-2  到jsyeh.org/3dcg10中

         windows.zip下載 windows\Transformation.exe

         data.zip下載 windows\data\很多模式

         把data拉進windows然後執行windows\Transformation.exe

        下方的右鍵可以改成Swap或是Rotate

         一個個是物體自轉另一個是公轉

1-3
在鍵盤上按下按鍵會出現對應的位置
#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);
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMainLoop();

    return 0;



}

2-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);
}
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_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week06 keyboard");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();

    return 0;



}

2-2
透過設定mousex,mousey來設定滑鼠,設定完成後能夠透過滑鼠移動茶壺的位置
#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);
   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_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week06 keyboard");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();

    return 0;



}


2-3
加入scale後依照scale加入程式執行後能夠把圖片放大或是縮小
#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();
   glScaled(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)
{
   if(mouseX>oldX)scale=scale*1.01;
   if(mouseY<oldY)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();

    return 0;



}
3-1
加入w,e,r在程式碼中,執行時能夠透過w來進行移動圖案,透過r來進行大小的縮放。
#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);
   glRotatef(angle,0,0,1);
   glScaled(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);
    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==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();

    return 0;

}





3-2
加入else if now==2等於做了旋轉的部分,透過按鍵e可以選轉整個圖案的方向
#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 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_DOUBLE|GLUT_DEPTH);
    glutInitWindowSize(500,500);
    glutCreateWindow("week06 keyboard mouse motion");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();

    return 0;

}



沒有留言:

張貼留言