複習T,R,S的mouse和motion
1.請先下載win32,data和glut32.dll的檔案
2.請把window,data解壓縮,並把glut32.dll和data資料夾放進window資料夾裡
3.並開啟Transformation.exe這個檔案
瞭解T,R,T轉動和階層性轉動
1.學習Swap translate/rotate的差異 程式碼請由下往上看
(1)這個轉動為自轉
(自轉:指物件自行旋轉的運動,物件會沿著一條穿越身件本身的軸旋轉)
glTranslatef(0,0,-6);///先把樓上註解,移到z:-6
(1)這個轉動為自轉
(自轉:指物件自行旋轉的運動,物件會沿著一條穿越身件本身的軸旋轉)
(2)這個轉動為公轉
(3)這是兩張圖放在一起的圖(可以觀察出兩者的差異)
2.第二種瞭解T,R,T轉動的方式
(1)請開啟CodeBlocks的軟體,並從File→New中建立Project
(2)點選GLUT的圖示並點選GO
(3)點選Next
(4)請命名你的標題
(5)這時一樣打開上週下載的freeglut的資料夾,並檢查是否已複製libfreeglut.a的檔案
和重新命名成libglut32.a
(6)把資料夾的網址複製到location的下方空白欄

(7)點選Finish即可

(8)請用ctrl+f(搜尋)去找display(void)
(9)這時把圖片中的三行先註解,並加上這行程式碼(中文為註解)glTranslatef(0,0,-6);///先把樓上註解,移到z:-6
10.這時請把這行註解取消(中文為註解
glRotated(a,0,0,1);///對Z軸轉動
11.請修改和加入程式碼
保留這兩行
glTranslated(-2.4,1.2,-6);///把下面轉動的球,整個移動到左上角
glRotated(a,0,0,1);///轉動
和加入glColor3f(1,1,1);
從圖中可看到紅色球和其他球所轉動的方向不同
12.這時把這兩行互換位置
glRotated(a,0,0,1);///轉動
glTranslated(-2.4,1.2,-6);///把下面轉動的球,整個移動到左上角
從圖中你會看到紅球會繞著一個中心點旋轉
3.如何改變茶壺的中心點
(1)請先輸入或複製以下的程式碼
一開始會顯得很不整齊,這時請按滑鼠右鍵並選擇Format use AStyle
#include <GL/glut.h>
float angle=0;///Now: 讓茶壼自動轉動的角度
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///Now:備份矩陣
glRotatef(angle, 0,0,1);///Now:轉動
glutSolidTeapot(0.3);
glPopMatrix();///Now:還原矩陣
glutSwapBuffers();
}
void motion(int x, int y)
{
angle=x;///Now: 改變角度
glutPostRedisplay();///Now: 請 重畫畫面
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("Week05 TRT");
float angle=0;///Now: 讓茶壼自動轉動的角度
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///Now:備份矩陣
glRotatef(angle, 0,0,1);///Now:轉動
glutSolidTeapot(0.3);
glPopMatrix();///Now:還原矩陣
glutSwapBuffers();
}
void motion(int x, int y)
{
angle=x;///Now: 改變角度
glutPostRedisplay();///Now: 請 重畫畫面
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("Week05 TRT");
glutDisplayFunc(display);
glutMotionFunc(motion);///Now:
glutMainLoop();
}
glutMotionFunc(motion);///Now:
glutMainLoop();
}
(2)使茶壺炳移動到中心點
請在rotatef這行程式碼下面加入
glTranslatef(0.45,-0.10,0);///Now2:把茶壺炳放到正中間
(3)再修改這些程式碼
glColor3f(1,0,0); glutSolidTeapot(0.3);///Now3: 中間的紅色茶壺
glTranslatef(0.45,-0.10,0);///(1)先 Now2:把茶壺炳放到正中間
glRotatef(angle, 0,0,1);///Now:轉動
glColor3f(0,1,0); glutSolidTeapot(0.3);
glPopMatrix();///Now:還原矩陣
(4)試著把綠色茶壺炳接到紅色茶壺
請把程式碼改成如下圖所示
glColor3f(1,0,0); glutSolidTeapot(0.3);///Now3: 中間的紅色茶壺
glTranslatef(0.4,0.13,0);
glRotatef(angle, 0,0,1);///Now:轉動
glTranslatef(0.45,-0.10,0);///(1)先 Now2:把茶壺炳放到正中間
glColor3f(0,1,0); glutSolidTeapot(0.3);
glPopMatrix();///Now:還原矩陣
(5)可以再做些改變
加入這程式碼glPushMatrix();
並複製
glColor3f(1,0,0); glutSolidTeapot(0.3);///Now3: 中間的紅色茶壺
glPushMatrix();///Now4:右手臂
glTranslatef(0.4,0.13,0);
glRotatef(angle, 0,0,1);///Now:轉動
glTranslatef(0.45,-0.10,0);///(1)先 Now2:把茶壺炳放到正中間
glColor3f(0,1,0); glutSolidTeapot(0.3);
(6)可再做出左邊的部分(由於在左邊,所以必須改為負號)
glPushMatrix();///Now4:左手臂
glTranslatef(-0.4,0.13,0);
glRotatef(angle, 0,0,1);///Now:轉動
glTranslatef(-0.45,-0.10,0);///(1)先 Now2:把茶壺炳放到正中間
glColor3f(0,1,0); glutSolidTeapot(0.3);
(7)最後,可再把左邊的程式碼稍微修改
glRotatef(-angle, 0,0,1);///Now:轉動
可以發現它的轉換方式有改變






沒有留言:
張貼留言