Part1 分辨車子自轉與公轉
1.先到jsyeh.org/3dcg10下載data、win32、glut32.dll
2.把windows、data資料夾解壓縮,將data和glut32.dll丟到windows資料夾裡
3.點選Transformation就會出現上面的畫面,在下面的窗格按下右鍵,選Swap translate/rotate可以改glTranslatef和glRotate的順序。選Reset還原預先設定
4.由下往上看,所以是先移動再旋轉,此為公轉
5.由下往上看,所以是先旋轉再移動,此為自轉
Part2 用codeblocks教TRT
1.先新增GLUT專案,為week05_TRT
2.先找到display函式,更改第一個的glPushMatrix和glPopMatrix,程式碼如下:
glPushMatrix();
glTranslated(-2.4,1.2,-6);///(2)將對z軸轉動的球移動位置
glRotated(a,0,0,1);///(1)球對z軸做旋轉
glutSolidSphere(1,slices,stacks);
glPopMatrix();
執行結果會出現球在左上角的位置自轉
3.將glTranslated和glRotated做對調,程式碼如下:
glPushMatrix();
glRotated(a,0,0,1);///(2)將移動後的球做旋轉
glTranslated(-2.4,1.2,-6);///(1)球移動位置
glutSolidSphere(1,slices,stacks);
glPopMatrix();
執行結果會發現球繞著某個中心點做公轉
Part3 將茶壺做旋轉
1.運用上週的程式碼畫出白色的茶壺
2.順利將茶壺以中心點做旋轉,程式碼如下:
#include <GL/glut.h>
float angle=0;///(1)將茶壺自動轉動的角度
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///(1)備份矩陣
glRotatef(angle,0,0,1);///(1)轉動
glutSolidTeapot(0.3);
glPopMatrix();///(1)還原矩陣
glutSwapBuffers();
}
void motion(int x, int y)
{
angle=x;///(1)改變角度
glutPostRedisplay();///(1)重畫畫面
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("05160035_Week05 TRT");
glutDisplayFunc(display);
glutMotionFunc(motion);(1)
glutMainLoop();
}
3.現在要讓茶壺以手把為中心點做旋轉,運用上面的技巧,我們在glPushMatrix和glPopMatrix增加位置的移動,再做旋轉,程式碼如下:
glPushMatrix();///(1)備份矩陣
glRotatef(angle,0,0,1);///(1)將移動後的茶壺做轉動
glTranslated(0.45,-0.10,0);///(2)移動位置,將手把變為中心點
glutSolidTeapot(0.3);
glPopMatrix();///(1)還原矩陣
glutSwapBuffers();
順利將茶壺以手把為旋轉軸,呈現出倒茶的樣子
4.增加一個茶壺,將兩個茶壺做連接,將其中一個做旋轉,程式碼如下:
glColor3f(1,1,0); glutSolidTeapot(0.3);///(3)畫出中間的黃色茶壺
glPushMatrix();///(1)備份矩陣
glTranslated(0.4,0.13,0);///(3)將藍色茶壺以手把為旋轉軸,整個移動位置,掛在黃色茶壺的壺口
glRotatef(angle,0,0,1);///(1)轉動
glTranslated(0.45,-0.10,0);///(2)移動位置,將藍色茶壺的手把變為旋轉軸
glColor3f(0,1,1); glutSolidTeapot(0.3);///(3)畫出藍色的茶壺
glPopMatrix();///(1)還原矩陣
將藍色茶壺順利掛在黃色壺口做旋轉
5.將剛剛寫出來的複製貼上,做出右手臂和右手肘,程式碼如下:
glPushMatrix();
glColor3f(1,1,0); glutSolidTeapot(0.3);///(3)畫出中間的黃色茶壺
glPushMatrix();///右手臂
glTranslated(0.4,0.13,0);///(3)最後掛上去
glRotatef(angle,0,0,1);///(1)轉動
glTranslated(0.45,-0.10,0);///(2)移動位置,將藍色茶壺的手把變為旋轉軸
glColor3f(0,1,1); glutSolidTeapot(0.3);///(3)畫出藍色的茶壺
glPushMatrix();///右手肘
glTranslated(0.4,0.13,0);///(3)最後掛上去
glRotatef(angle,0,0,1);///(1)轉動
glTranslated(0.45,-0.10,0);///(2)移動位置,將藍色茶壺的手把變為旋轉軸
glColor3f(0,1,1); glutSolidTeapot(0.3);///(3)畫出藍色的茶壺
glPopMatrix();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
順利將右手臂和手肘完成
6.運用同樣的方式做出左手臂和左手肘,但在每個移動的x方向要改成負的,因為是反方向
製作出很像海帶樣子的模樣,兩隻手臂和手肘
更改左手的每個旋轉angle為負號,與右手剛好反方向旋轉,就可以製作出像在揮手的樣子。













沒有留言:
張貼留言