2020年3月17日 星期二

week03 teapot額外擴充


拿上禮拜的程式繼續新增功能
include <GL/glut.h>
#include <stdio.h> //小黑視窗
void display()
{
    glColor3f(1.0,0.5,1.0);
    glutSolidTeapot(0.3); ///茶壺
    glutSwapBuffers();
}
void mouse(int button,int state,int x,int y) //新增鼠標記錄功能
{
    printf("%d %d %d %d\n",button,state,x,y); ///在小黑視窗中顯示結果
}
int main(int argc, char *argv[])
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week03"); ///出現視窗
    glutDisplayFunc(display); ///顯示
    glutMouseFunc(mouse); ///鼠標記錄
    glutMainLoop();
}

在一個視窗中:
(0,0)-----(+,0)
 |
 |
(0,+)

(Button,State,X,Y)
X和Y當然就是鼠標得位置
Button:0:左鍵 1:滾輪 2:右鍵 3:滾輪往上 4:滾輪往下
State: 0按下 1鬆開 (不適用於Button為3或4時)

(如果想讓中心變成0?)
只需要改成這樣就可以了。
printf("%d %d %f %f\n",button,state,(x-150)/150.0,-(y-150)/150.0); (Y的話原本是上下顛倒...所以要加負號)
            (0,+)
                |
(-,0)----(0,0)----(+,0)
                |
             (0,-)


--------------------------------------


接下來看看如何讓茶壺跑到鼠標的位置:
#include <GL/glut.h>
#include <stdio.h>
float teapotX=0, teapotY=0;///由於數字可能會包含小數點,所以必須是這種變數
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//先清除整個螢幕
    glPushMatrix();///備份矩陣
        glTranslatef(teapotX,teapotY,0);///移動到指定位置(位置於void mouse中決定)
        glutSolidTeapot(0.3); ///茶壺
    glPopMatrix();///備份矩陣
    glutSwapBuffers();
}
void mouse(int button,int state,int x,int y)
{
    printf("%d %d %f %f\n",button,state,(x-150)/150.0,-(y-150)/150.0);
    teapotX=(x-150)/150.0;///設定移動位置
    teapotY=-(y-150)/150.0;///設定移動位置
}
int main(int argc, char *argv[])///基本上還是一樣
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week03");
    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    glutMainLoop();
}

沒有留言:

張貼留言