2022年3月22日 星期二

Ru的電腦圖學筆記>

 

💩Step01 用鍵盤顯示座標

    1.前置作業:https://jsyeh.org/3dcg10/ 下載 window、data
    2.到 moodle 下載 freeglut 解壓縮
    3.開啟 codeblocks 建立新的 GLUT 檔案
        -檔名:week05_keyboard
        -製作出一個滑鼠移到圖片某個位置,然後按一個數字或英文,會在小視窗上出現座標
        #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("第05週的程式哦!");
            glutDisplayFunc(display);
            glutKeyboardFunc(keyboard);
            glutMainLoop();
        }


                  
💩Step02 接續 week05_keyboard 新增一個 keyboard+mouse+motion
    1.檔名:week05_keyboard_mouse_motion         
        #include <GL/glut.h>
        #include <stdio.h>
        float x=0, y=0, z=0;
        int oldX=0, oldY=0;
        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)
        {
        }
        void mouse(int button,int state,int mouseX,int 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("第05週的程式哦!");
            glutDisplayFunc(display);
            glutKeyboardFunc(keyboard);
            glutMouseFunc(mouse);
            glutMotionFunc(motion);
            glutMainLoop();
        }
       
    2.更改背景,變成灰色;並且修改瞬間移動的錯誤

💩Step03 增加 scale 放大縮小功能
    1.讓滑鼠往右移的時候會放大,往左時縮小
        #include <GL/glut.h>
        #include <stdio.h>
        float x=150, y=150, z=0,scale=1.0;
        int oldX=0, oldY=0;
        void display()
        {
            glClearColor(0.5,0.5,0.5,1);///R,G,B,A 其中A為半透明功能
            glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
                glPushMatrix();///備份矩陣
                    glTranslatef((x-150)/150.0,-(y-150)/150.0,z);
                    glScalef(scale,scale,scale);
                    glColor3f(1,1,0);///黃色
                    glutSolidTeapot(0.3);///茶壺
                glPopMatrix();///還原矩陣
                glutSwapBuffers();
        }
        void keyboard(unsigned char key, int x, int y)
        {

        }
        void mouse(int button,int state,int mouseX,int mouseY)
        {
            ///為了解決瞬間移動的錯誤,改用正確的方法
            oldX=mouseX; oldY=mouseY;
        }
        void motion(int mouseX,int mouseY)
        {
            if(mouseX-oldX > 0) scale *= 1.01;
            if(mouseX-oldX < 0) scale *= 0.99;
            oldX=mouseX;      oldY=mouseY;
            display();
        }
        int main(int argc, char** argv)
        {
            glutInit( &argc, argv );
            glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
            glutCreateWindow("第05週的程式哦!");
            glutDisplayFunc(display);
            glutKeyboardFunc(keyboard);
            glutMouseFunc(mouse);
            glutMotionFunc(motion);
            glutMainLoop();
        }

完成!!!💞💞💞💞💞💞💞

沒有留言:

張貼留言

VERY BEAUTIFUL, VERY POWERFUL

一.     一樣先安裝且設定好freeglut,OpecCV, 開啟CodeBlocks建立新專案 week11_gundam,                 把 MyGundam.zip下載解壓縮後的data資料夾放到freeglut/bin裡面 把week09_openc...