2022年3月22日 星期二

雪⛄電腦圖學筆記05~

2022/3/15 第五周  

主題 : 移動、旋轉、縮放、矩陣

1. 電腦圖學之父------伊凡·蘇澤蘭 Ivan Edward Sutherland

    發明

2. 開啟windows/transformation.exe

    下面可以交換Rotatef跟Translatef的上下順序

    公轉與自轉的差別


3. 鍵盤+滑鼠 

鍵盤函式----glutKeyboardFunc(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("week05 keyboard");

        glutDisplayFunc(display);

        glutKeyboardFunc(keyboard);///鍵盤函式

        glutMainLoop();

    }




4. 配合上周的滑鼠函式 和 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)///鍵盤函式 keyboard

{

}

void mouse(int button, int state, int mouseX, int mouseY)///上上週的主題 mouse

{

}

void motion(int mouseX, int mouseY)///上週的主題 motion

{

    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("week05 keyboard");

    glutDisplayFunc(display);

    glutKeyboardFunc(keyboard);///鍵盤函式 keyboard

    glutMouseFunc(mouse);///上上週的主題 mouse

    glutMotionFunc(motion);///上週的主題 motion

    glutMainLoop();

}


5. 讓茶壺出現在中間 加上背景顏色修改茶壺在移動的時候的瞬間移動問題

#include <GL/glut.h>

#include <stdio.h>

float x=150, y=150, z=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);

        glColor3f(1,1,0);

        glutSolidTeapot(0.3);

    glPopMatrix();///還原矩陣

    glutSwapBuffers();

}

void keyboard(unsigned char key, int mouseX, int mouseY)///鍵盤函式 keyboard

{

}

void mouse(int button, int state, int mouseX, int mouseY)///上上週的主題 mouse

{

    oldX = mouseX;   oldY = mouseY;///解決瞬間移動的問題

}

void motion(int mouseX, int mouseY)///上週的主題 motion

{

    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("week05 keyboard");

    glutDisplayFunc(display);

    glutKeyboardFunc(keyboard);///鍵盤函式 keyboard

    glutMouseFunc(mouse);///上上週的主題 mouse

    glutMotionFunc(motion);///上週的主題 motion

    glutMainLoop();

}



6. 讓茶壺可以放大縮小

#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);///縮放都乘 scale倍

        glColor3f(1,1,0);

        glutSolidTeapot(0.3);

    glPopMatrix();///還原矩陣

    glutSwapBuffers();

}

void keyboard(unsigned char key, int mouseX, int mouseY)///鍵盤函式 keyboard

{

}

void mouse(int button, int state, int mouseX, int mouseY)///上上週的主題 mouse

{

    oldX = mouseX;   oldY = mouseY;///解決瞬間移動的問題

}

void motion(int mouseX, int mouseY)///上週的主題 motion

{

    if( mouseX-oldX > 0 ) scale*=1.01;///往右邊拉 放大

    if( mouseX-oldX < 0 ) scale*=0.99;///往左邊拉 縮小

    ///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("week05 keyboard");

    glutDisplayFunc(display);

    glutKeyboardFunc(keyboard);///鍵盤函式 keyboard

    glutMouseFunc(mouse);///上上週的主題 mouse

    glutMotionFunc(motion);///上週的主題 motion

    glutMainLoop();

}




###題外話------想要將github的程式碼放在blogger

1. gist.github.com 

2. 再用blogger左上角(筆)的html檢視,把紅色圈起來的網址貼上去



沒有留言:

張貼留言

VERY BEAUTIFUL, VERY POWERFUL

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