2024年3月7日 星期四

電腦圖學WEEK03

 week03_mouse


1.桌面安裝 freeglut , 把 lib 的 libfreeglut.a 複製成 libglut32.a

2. File-New-Project , GLUT 專案 week03_mouse 記得目錄(桌面) , GLUT目錄(桌面/freeglut)

3. 貼上10行程式碼

4. 加3行 mouse

#include <GL/glut.h>
#include <stdio.h>///為了printf
void mouse (int button, int state, int x, int y)
{
    printf("Hello Mouse!\n");
}

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);///(1) 註冊mouse函式
       glutMainLoop();
}

5. 修改第5行 printf 程式碼 , 讓他點下去變成座標

6. 會有四個顯示結果

第一個是滑鼠鍵 0=滑鼠左鍵 1=滑鼠中鍵 2=滑鼠右鍵

第二個滑鼠點下去會顯示 0 滑鼠反彈上來會顯示 1

第三個是x座標

第四個是y座標

#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);
}
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);///(1) 註冊mouse函式

       glutMainLoop();
}

7. 再修改第6行程式碼 改成在小黑裡面隨意亂點會出現程式碼


#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);///(1) 註冊mouse函式

       glutMainLoop();
}

試著了解glRoatatef(角度x,y,z)的參數

1. 至下面網站下載課本範例data和win32


2. 將兩個檔案解壓縮 把data拉進windows裡面


3. 點下transformation.exe就會出現以下圖片中的課本範例

4. 滑鼠右鍵點右上角模型可以改模型

5. 下面滑鼠右鍵可以還原到初始數值

6.數值轉動可以利用右手比讚來理解

7.轉動軸 , 就是讚的那個拇指 , 轉動方向 , 就是其他手指的轉動方向

8.對y軸轉 , 簡單比個讚 , 完成

9.對x軸轉 , 要把拇指向右 , 也可以轉

10.對-y軸轉 , 就是比個倒讚 , 也可以理解

11.最難的是z軸 , 向著哪裡呢 , 那個拇指向著你的鼻子


week03_mouse_glTranslatef


1.新增新專案名稱week03_mouse_glTranslateef

2.修改mouse的程式碼就可以用滑鼠移動茶壺了


///程式從 week03_mouse 拿來用
#include <GL/glut.h>
#include <stdio.h>
float teapotX = 0, teapotY = 0;
void mouse (int button, int state, int x, int y)
{
    teapotX = (x-150)/150.0;
    teapotY = -(y-150)/150.0;
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glTranslatef(teapotX, teapotY, 0);
        glutSolidTeapot( 0.3 );
    glPopMatrix();
    glutSwapBuffers();
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week03_mouse");
    glutDisplayFunc(display);
    glutMouseFunc(mouse);///(1) 註冊mouse函式

       glutMainLoop();
}



week03_mouse_glRoatef

1.File-New-Project , GLUT專案 week03_mouse_glRotatef

2.修改程式碼就能轉動茶壺了


///程式從 week03_mouse 拿來用
#include <GL/glut.h>
#include <stdio.h>
float teapotX = 0, teapotY = 0;
float angle = 0;
void mouse (int button, int state, int x, int y)
{
    teapotX = (x-150)/150.0;
    teapotY = -(y-150)/150.0;
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(angle, 0, 0, 1);
        glutSolidTeapot( 0.3 );
    glPopMatrix();
    glutSwapBuffers();
}
void motion(int x, int y)
{
    angle = x;
    display();
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week03_mouse");
    glutDisplayFunc(display);
    glutMouseFunc(mouse);///(1) 註冊mouse函式
    glutMotionFunc(motion);///(3) motion的細節
       glutMainLoop();
}


week03_mouse_translate_rotate

1.File-New-Project , GLUT專案 week03_mouse_translate_rotate

2.修改程式碼案w可以移動茶壺

3.按e可以選轉茶壺

///程式從 week03_mouse 拿來用
#include <GL/glut.h>
#include <stdio.h>
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);
        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");
    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutKeyboardFunc(keyboard);///按鍵
    glutMainLoop();
}














沒有留言:

張貼留言