2021年3月15日 星期一

橘貓(電圖小筆記_week04)

今天要跟大家介紹幾個OPEN_GL中有趣的函式,和概念.

1.MOUSE函式

2.MOTION函式

3.Transformation藍色車車旋轉概念

MOUSE函式

今天要來介紹使用滑鼠的程式碼 

引用上週Week03的teapot的程式碼當基底

在其中增加一滑鼠的函式(mouse)

#include <GL/glut.h>

#include <stdio.h>

static void display(void)//顯示函示

{

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glutSolidTeapot(0.3);//茶壺的程式碼

    glutSwapBuffers();

}

void mouse(int button,int state,int x,int y)//滑鼠的程式碼

button:滑鼠按鍵判定(0:右鍵,1:左鍵,2:中鍵).

state:滑鼠狀態(0:按下,1:放開).

x,y:滑鼠x和y的位置.

{

        printf("button:%d state:%d x:%d y:%d\n",button,state,x,y);

}

int main(int argc, char *argv[])//主要函式

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("08160394 teapot");

    glutDisplayFunc(display);//呼叫顯示函示

    glutMouseFunc(mouse);//在此呼叫mouse的函式

    glutMainLoop();

}


接下來可以運用滑鼠點出點畫出多邊形
首先要更動mouse函式中的程式碼
void mouse(int button,int state,int x,int y)
{
    if(state==GLUT_DOWN){
            printf("glVertext3f((%d-150)/150.0,(%d-150)/150.0,0);\n",x,y);
        }
}
//glVertext3f((%d-150)/150.0,(%d-150)/150.0,0);此段是在display函式中glBegin裡面的座標設定
//state==GLUT_DOWN(滑鼠狀態如果是按下的話)
再改完這個函式之後就可以跑一次
由此得到程式碼
1.點擊茶壺視窗,滑鼠點擊的點會顯示在右邊
2.接著複製每個點,製作多邊形

在display函式中貼上

並加上
glBegin(GL_POLYGON);開始(GL_多邊形)和glEnd();圖形結束
    glBegin(GL_POLYGON);
    glVertex3f((202-150)/150.0,(125-150)/150.0,0);
    glVertex3f((231-150)/150.0,(131-150)/150.0,0);
    glVertex3f((223-150)/150.0,(197-150)/150.0,0);
    glVertex3f((182-150)/150.0,(198-150)/150.0,0);
    glVertex3f((101-150)/150.0,(201-150)/150.0,0);
    glVertex3f((58-150)/150.0,(166-150)/150.0,0);
    glVertex3f((64-150)/150.0,(114-150)/150.0,0);
    glVertex3f((107-150)/150.0,(108-150)/150.0,0);
    glVertex3f((115-150)/150.0,(75-150)/150.0,0);
    glVertex3f((150-150)/150.0,(78-150)/150.0,0);
    glVertex3f((165-150)/150.0,(38-150)/150.0,0);
    glVertex3f((188-150)/150.0,(38-150)/150.0,0);
    glVertex3f((183-150)/150.0,(70-150)/150.0,0);
    glVertex3f((212-150)/150.0,(71-150)/150.0,0);
    glVertex3f((250-150)/150.0,(65-150)/150.0,0);
    glVertex3f((277-150)/150.0,(135-150)/150.0,0);
    glEnd();
就可以快速完成多邊形了!

MOTION函式

原本茶壺在視窗的正中間
由滑鼠拖移被移動到左上
float teapotX=0,teapotY=0;//首先要先把茶壺的位置重置
static void display(void)///顯示函示
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();                                  //矩陣備份
        glTranslatef(teapotX,teapotY,0);   //照座標移動
        glutSolidTeapot(0.3);                    //畫茶壺的程式碼
    glPopMatrix();                                  //陣列還原
    glEnd();                                            //結束
    glutSwapBuffers();
}
void motion(int x,int y)                       //移動的函式
{
    teapotX=(x-150)/150.0;                   //紀錄茶壺移動的X,Y值
    teapotY=-(y-150)/150.0;
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("08160394 teapot");
    glutDisplayFunc(display);
    glutMotionFunc(motion);///呼叫移動的函式
    glutMainLoop();
}

Transformation藍色車車旋轉蓋念


glTranslate();位置(x,y,z);

glRotatef();旋轉(四個方位)
glScalef();物件大小(x,y,z);
glBegin(...);

使用滑鼠旋轉物體


沒有留言:

張貼留言

Week18期末作業(橘貓的跳舞熊熊)

 期末作業(橘貓的跳舞熊熊) 影片: https://youtu.be/R89tptMaQZw 程式碼: #include <opencv/highgui.h> #include <opencv/cv.h> #include <GL/glut.h...