2024年3月7日 星期四

罐頭's 電腦圖學日記 Week03

  week03  

#week03_mouse
0. 桌面安裝 freeglut , 把 lib 的 libfreeglut.a 複製成 libglut32.a
1. File-New-Project , GLUT 專案 week03_mouse  (檔案位置:桌面) ,GLUT目錄(桌面/freeglut 複製上去)
2. 貼上10行程式碼(github)
3. 加三行新的 mouse



4. 新增一行程式碼 printf("%d %d %d %d\n", button, state, x, y);
    button 代表 滑鼠按鍵 (0左 1中 2右)
    state 滑鼠鍵按下去 & 起來
    x y 代表座標


5. 新增 7、8 行 ,點擊螢幕跳出座標


#看課本範例
1. 請到 https://jsyeh.org/3dcg10 下載課本範例 data 及 win32 兩個檔案
2. windows.zip 解壓縮 => data.zip點開 => 將data資料夾複製到windows裡
3. 點開 Transformation.exe


#week03_mouse_glTranslatef
1. File-New-Project , GLUT 專案 week03_mouse_glTranslatef
2. 複製程式碼 46 49 54 行

執行畫面:滑鼠點哪 茶壺就到哪


#轉動 (安培右手定則)
粉色代表轉動的角度
橘色代表X軸
黃色代表Y軸
藍色代表Z軸
當X軸等於1.00時 大拇指朝X軸正向擺(朝右) 剩下四肢手指頭朝下轉動
當Y軸等於1.00時 大拇指朝Y軸正向擺(朝上) 剩下四肢手指頭朝右轉動
當Z軸等於1.00時 大拇指朝Z軸正向擺(朝自己) 剩下四肢手指頭朝下轉動


#week03_mouse_Rotatef

1. File-New-Project , GLUT 專案 week03_mouse_glRotatef
2.把week03_mouse_Translatef 的程式拿來用
3.轉動


#week03_mouse_translate_rotate




1.
#include <GL/glut.h>
#include <stdio.h> ///為了printf()
void mouse(int button, int state, int x, int y)
{
    ///printf("Hello Mouse!\n");
    ///printf("%d %d %d %d\n",button,state,x,y);
    if(state==GLUT_DOWN)
        printf("glVertex2f((%d-150)/150.0),(-(%d-150)/150.0);\n",x,y);
}
void display()
{
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week03_mouse");
    glutDisplayFunc(display);
    glutMouseFunc(mouse);///註冊mouse函式

    glutMainLoop();
}




2.
#include <GL/glut.h>
#include <stdio.h> ///為了printf()
void mouse(int button, int state, int x, int y)
{
    ///printf("Hello Mouse!\n");
    ///printf("%d %d %d %d\n",button,state,x,y);
    if(state==GLUT_DOWN)
        printf("glVertex2f((%d-150)/150.0),(-(%d-150)/150.0);\n",x,y);
}
void display()
{
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week03_mouse");
    glutDisplayFunc(display);
    glutMouseFunc(mouse);///註冊mouse函式

    glutMainLoop();
}



3.
#include <GL/glut.h>
#include <stdio.h> ///為了printf()
void mouse(int button, int state, int x, int y)
{
    ///printf("Hello Mouse!\n");
    ///printf("%d %d %d %d\n",button,state,x,y);
    if(state==GLUT_DOWN)
        printf("glVertex2f((%d-150)/150.0),(-(%d-150)/150.0);\n",x,y);
}
void display()
{
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week03_mouse");
    glutDisplayFunc(display);
    glutMouseFunc(mouse);///註冊mouse函式

    glutMainLoop();
}


4.

#include <GL/glut.h>
#include <stdio.h> ///為了printf()
float teapotX =0 , teapotY = 0;
float angle =0;
int method =1;///1轉動 2移動
int oldX =0, oldY =0;///舊的座標
void mouse(int button, int state, int x, int y)
{
    oldX = x;///teapotX =(x-150)/150.0 ;
    oldY = y;///teapotY = -(y-150)/150.0 ;
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glTranslatef(teapotX, teapotY, 0);
        glRotatef(angle,0,0,1);///對Z軸轉
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
void motion(int x,int y)
{
    if(method==1){
        angle += x - oldX;
    }else if(method==2){
        teapotX += (x-oldX)/150.0;
        teapotY -= (y-oldY)/150.0;
    }
    oldX = x;
    oldY = y;
    display();
}
void keyboard(unsigned char key, int x, int y)
{
    if(key=='e') method = 1;///轉動
    if(key=='w') method = 2;///移動
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week03_mouse_rotate");
    glutDisplayFunc(display);
    glutMouseFunc(mouse);///註冊mouse函式
    glutMotionFunc(motion);///motion的細節
    glutKeyboardFunc(keyboard);///按鍵

    glutMainLoop();
}


















沒有留言:

張貼留言