2020年3月24日 星期二

擊滅戰不想農

每日婆,然後忘記做week03的網誌了

這周要理解Transformation的運作方法,先去http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/ 把data,win32和glut32.dll一起下載下來並且把data解壓縮放進win32裡面,就可使用裡面的模擬器。目前可以知道對於一個人物的XYZ軸有不同的旋轉方向。且旋轉的方向是基於安培右手定則來運作。以下是這個模擬器的圖片:
這裡是利用滑鼠來控制X軸來讓圖形轉動,其中要注意的是需要先void一個角度變數以及motion,並且執行一次motion後會重畫一次。
這裡則是把圖片換成茶壺,要注意的地方是其實跟上面的差不多,但是要注意PushMatrix的備份跟PopMatrix還原。
\
#include <GL/glut.h> ///為了glut函式
float myAngle=0;///宣告角度變數
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);///清畫面
    glPushMatrix();///備份
        glRotatef(myAngle,0,0,1);///對Z軸做旋轉,所以X跟Y的軸是0
        glutSolidTeapot(0.3);
    glPopMatrix();///還原
    glutSwapBuffers();
}

void motion(int x,int y)
{
    myAngle=x;///把角度放到X
    display();///做一次重劃一次
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week04 Rotate");

    glutMotionFunc(motion);
    glutDisplayFunc(display);
    glutMainLoop();
}
-----------------------------------------------------------以上程式碼------------------------------------------------
由於上一個程式執行後會發生一件事情-角度的直接更新會讓茶壺移動得很奇怪,所以我們在額外新增其他的程式碼來完善。而其中x-oldx的意思是說:滑鼠按下去後所產生的x減掉當初所記錄下來,最後離開滑鼠點所記錄的x,來產生新的x來進行移動。

#include <GL/glut.h> ///為了glut函式
float myAngle=0;///宣告角度變數
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);///清畫面
    glPushMatrix();///備份數值
        glRotatef(myAngle,0,0,1);///對Z軸做旋轉,所以X跟Y的軸是0
        glutSolidTeapot(0.3);///茶壺的尺寸
    glPopMatrix();///還原,防止數值疊加
    glutSwapBuffers();
}

int oldx=0;///當初移動的X值

void mouse(int button,int state,int x,int y)
{
    if(state==GLUT_DOWN) oldx=x;///如果按下去的話記錄當下的X值
}

void motion(int x,int y)
{
    myAngle+=(x-oldx);///把更新後的角度放到myAngle
    oldx=x;///把X的數值放到oldx裡面
    display();///做一次重劃一次
}

int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week04 Rotate");

    glutMotionFunc(motion);
    glutMouseFunc(mouse);
    glutDisplayFunc(display);
    glutMainLoop();
}

 -----------------------------------------------------------以上程式碼-----------------------------------------------

沒有留言:

張貼留言