WEEK05
Work01
旋轉與移動先後位置的差別
work01_1
第一步:先開啟Transformation.exe開啟程式
對下方的三種變數進行調整,根據調整的變數可看出不同的變化;利用兩組不同變數進行數據與實際觀看的比較,以這種方式看出移動(Translate)、旋轉(Rotate)、縮放(Scale)
圖一、對移動(Translate)、旋轉(Rotate)、縮放(Scale)的X變數設定
圖二、對移動(Translate)、旋轉(Rotate)、縮放(Scale)的任意變數進行設定,並與圖一做比較
work01_2
第二步:以Translate在上方,Rotate在下方,並調整數據做比較
可以看出如果是Translate在上方、Rotate在下方的排序,在旋轉的方面是以移動後的物體中心點作旋轉,不是針對「原點」進行旋轉。
work01_3
第三步:以Translate在下方,Rotate在上方,與第二步相同調整數據做比較
可以看出如果是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();
}
-------------------------------------------特殊程式碼解釋-----------------------------------------------
glPushMatrix();
將程式位置矩陣,紀錄於矩陣中的最上方,意旨將其丟入stack中,利用堆疊的方式存放
glPopMatrix();
-------------------------------------------------------補充函式碼-------------------------------------------------
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圖像的程式
buffer
以二位元紀錄資訊的記憶體
double
此處的GLUT_DOUBLE是代表著兩倍的buffer,為了是讓記憶體的容量變大,以便撰寫動畫或3D圖像的程式










沒有留言:
張貼留言