2022年3月22日 星期二

爆肝Week05

Week05:移動、旋轉、縮放、矩陣

範例 http://jsyeh.org/3dcg10
1. 下載網頁中的data, win32

2. 將windows解壓縮, data.zip/data丟進解壓縮後的windows資料夾
 3.開啟Translate.exe
    按Alt+S可以交換位移(glTranslatef)與旋轉(glRotatef)
    順序不同,效果也不同

鍵盤事件glutKeyboardFunc()
1.使用先前的茶壺程式碼,加上keyboard函式並利用printf()印出執行的動作
```
#include <stdio.h>///印出用
#include <GL/glut.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();
}

```
2-1.加上先前教過的Motion與Mouse函式
```
#include <stdio.h>///印出用
#include <GL/glut.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 mouse(int button, int state, int mouseX, int mouseY)
{
}
void motion(int mouseX, int mouseY)
{
}
void keyboard( unsigned char key, int mouseX, int mouseY )
{
}
int main(int argc, char** argv)
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("week05 keyboard");

    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);///鍵盤事件函式
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}
```


2-2.在Motion拖曳函式中加上參式與重設座標的公式
```
void motion(int mouseX, int mouseY)
{
    x +=(mouseX-oldX);
    y +=(mouseY-oldY);

    oldX = mouseX;
    oldY = mouseY;

    display();
}
```

2-3.在 mouse函式中設置錨點,去除圖形瞬移的錯誤
```
#include <stdio.h>///印出用
#include <GL/glut.h>
float x=150, y=150, z=0;///座標設定為150, 150在視窗正中央
int oldX=0, oldY=0;
void display()
{
    glClearColor(0.5, 0.5, 0.5, 1);///灰色背景R,G,B,A 其中A為半透明Alpha值
    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 mouse(int button, int state, int mouseX, int mouseY)
{///設置錨點,避免瞬間移動的問題
    oldX = mouseX; oldY = mouseY;
}
void motion(int mouseX, int mouseY)
{
    x +=(mouseX-oldX);
    y +=(mouseY-oldY);

    oldX = mouseX;
    oldY = mouseY;

    display();
}
void keyboard( unsigned char key, int mouseX, int mouseY )
{
}
int main(int argc, char** argv)
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("week05 keyboard");

    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);///鍵盤事件函式
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}
```

縮放函式glScalef()

3.加上縮放函式,在motion函式中改寫公式
```
#include <stdio.h>///印出用
#include <GL/glut.h>
float x=150, y=150, z=0, scale=1.0;///座標設定為150, 150在視窗正中央
int oldX=0, oldY=0;
void display()
{
    glClearColor(0.5, 0.5, 0.5, 1);///灰色背景R,G,B,A 其中A為半透明Alpha值
    glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///備分矩陣
        glTranslatef((x-150)/150.0, -(y-150)/150.0, z);
        glScalef(scale, scale, scale);///x,y,z縮放為 scale倍,維持原有比例
        glColor3f(1, 1, 0);
        glutSolidTeapot(0.3);
    glPopMatrix();///還原矩陣
    glutSwapBuffers();
}
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();
}
void keyboard( unsigned char key, int mouseX, int mouseY )
{
}
int main(int argc, char** argv)
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("week05 keyboard");

    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...