2016年3月21日 星期一

ModeR_Week05_GLUT教學_旋轉與移動先後的差別

WEEK05

Work01
旋轉與移動先後位置的差別

work01_1

第一步:先開啟Transformation.exe開啟程式



對下方的三種變數進行調整,根據調整的變數可看出不同的變化;利用兩組不同變數進行數據與實際觀看的比較,以這種方式看出移動(Translate)、旋轉(Rotate)、縮放(Scale)


圖一、對移動(Translate)、旋轉(Rotate)、縮放(Scale)的X變數設定


圖二、對移動(Translate)、旋轉(Rotate)、縮放(Scale)的任意變數進行設定,並與圖一做比較


work01_2

第二步:以Translate上方Rotate下方,並調整數據做比較


可以看出如果是Translate上方Rotate下方的排序,在旋轉的方面是以移動後的物體中心點作旋轉,不是針對「原點」進行旋轉。






work01_3

第三步:以TranslateRotate上方,與第二步相同調整數據做比較


可以看出如果是Translate下方Rotate上方的排序,在旋轉的方面是以移動後的物體中心點作旋轉,不是針對「原點」進行旋轉。





Work02
撰寫可旋轉的茶杯(旋轉應用)


和之前的動作相同,先開啟CodeBlock
開啟新的專案,從main.cpp撰寫程式
(記得是GLUT project,並將freeglut拉至程式內)
(如果不記得,請至Week02教學處觀看)




程式碼

#include <GL/glut.h>

float rotX = 0;//定義全域變數,旋轉的方向軸

void display()
{
    glClearColor(1,1,1,1);//背景顏色
    glClear(GL_COLOR_BUFFER_BIT);//清除背景
    glPushMatrix();//備份Matrix (Matrix裡有translate,rotate,scale的數值)
        glRotatef(rotX, 0,1,0);//以X方向做變量,對Y軸做旋轉
        glColor3f(1,0,0);//茶杯顏色
        glutSolidTeapot(0.3);//茶杯大小
    glPopMatrix();//還原Matrix (回傳到剛剛push時的樣子)
    glutSwapBuffers();//將程式輸出至Buffer上
}

void motion(int x,int y)
{
    rotX = x;//X座標放置變數中
    display();//呼叫display函式庫
}

int main(int argc, char**argv)
{
    glutInit(&argc, argv);//開啟程式
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);//double buffers兩倍記憶體與深度設定
    glutCreateWindow("Hello");//設定視窗名稱

    glutDisplayFunc(display);//呼叫display函式
    glutMotionFunc(motion);//呼叫motion函式
    glutMainLoop();

}

-------------------------------------------------------補充函式碼-------------------------------------------------


float rotX = 0,rotY = 0;

void display()
{
    glClearColor(1,1,1,1);
    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();
        glRotatef(rotX, 0,1,0);
        glRotatef(rotY, 1,0,0);//以Y方向做變量,對X軸做旋轉
        glColor3f(1,0,0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}

void motion(int x,int y)
{
    rotX = x;
    rotY = y;
    display();
}

int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowPosition( 700, 10 );//以視窗左上角為中心點,設置視窗初始位置
    glutInitWindowSize( 500,500 );//設定視窗大小
    //注意:此處的數字並不是公分,而是畫素

    glutCreateWindow("Hello");

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


Work03


-------------------------------------------特殊程式碼解釋-----------------------------------------------

glPushMatrix();
將程式位置矩陣,紀錄於矩陣中的最上方,意旨將其丟入stack中,利用堆疊的方式存放

glPopMatrix();
將紀錄於堆疊(stack)中至頂矩陣拉出,回歸原來的位置

buffer
以二位元紀錄資訊的記憶體

double
此處的GLUT_DOUBLE是代表著兩倍的buffer,為了是讓記憶體的容量變大,以便撰寫動畫或3D圖像的程式


沒有留言:

張貼留言