打開上周已經使用過的 Transformation.exe
Week 05 - Part 1 - 1 - 自轉
由下圖彩虹方框可以來了解,此程式碼該怎麼看
此程式碼依照綠色→黃色→橘色→紅色(由下往上)來讀取
1. glBegin(....); ///畫出一台車子
2. glScalef(x,y,z); ///一台縮大/縮小的車子
3. glRotatef(angle,x,y,z); ///轉動一台(放大/縮小)的車子
4. glTranslatef(x,y,z); ///移動一台[旋轉過後且(放大/縮小)]的車子
由上個步驟來觀察,我們可以得知
當glTranslatef(x,y,z)在glRotatef(angle,x,y,z)上,則物件做自轉的動作
Week 05 - Part 1 - 2 - 公轉
由下圖彩虹方框可以來了解,此程式碼該怎麼看
此程式碼依照綠色→黃色→橘色→紅色(由下往上)來讀取
1. glBegin(....); ///畫出一台車子
2. glScalef(x,y,z); ///一台縮大/縮小的車子
3. glTranslatef(x,y,z); ///移動一台(放大/縮小)
4. glRotatef(angle,x,y,z); ///轉動一台[移動過後且(放大/縮小)的車子]
由上個步驟來觀察,我們可以得知
當glRotatef(angle,x,y,z)在glTranslatef(x,y,z)上,則物件做公轉的動作
Week 05 - Part 2 - 使用GLUT progect原本的程式碼來做修改
glPushMatrix();
glRotated(a,0,0,1);///轉動(位置移到左上角)的物件
glTranslated(-2.4,1.2,-6);///物件位置移到左上角
glutSolidSphere(1,slices,stacks);
glPopMatrix();
由下圖可見,原本在左上角做自轉的物件,現在變成公轉了
Week 05 - Part 3 - 1 - 轉動的茶壺
將原本GLUT專案的程式碼刪除,到Facebook社團中複製老師已經幫我們打好的程式碼,
到codeblocks中貼上,但會發現程式碼的排版不好
在程式碼旁邊空白之處,按下右鍵,點選 Format use AStyle
Format use AStyle 點選後,系統會自動幫我們編排程式碼的排版(如下圖)
將茶壺把手的位置放到中間
#include <GL/glut.h>
float angle=0;///讓茶壼自動轉動的角度
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///備份矩陣
glTranslatef(0.45,-0.10,0);///把茶壺把手放到中間,方便等一下做轉動的動作
glutSolidTeapot(0.3);
glPopMatrix();///還原矩陣
glutSwapBuffers();
}
void motion(int x, int y)
{
angle=x;///改變角度
glutPostRedisplay();///重畫畫面
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("Week05 TRT");
glutDisplayFunc(display);
glutMotionFunc(motion);
glutMainLoop();
}
下圖紅色方框內可看見茶壺把手的位置已被移動過
加上讓茶壺把手能夠轉動的程式碼
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///備份矩陣
glRotatef(angle, 0,0,1);///3.轉動把手被放到中間的茶壺
glTranslatef(0.45,-0.10,0);///2.把茶壺把手放到中間
glutSolidTeapot(0.3);///1.畫出一個茶壺
glPopMatrix();///還原矩陣
glutSwapBuffers();
}
下圖紅色方框可見茶壺把手在中間且可以轉動了
Week 05 - Part 3 - 2 - 多個茶壺的轉動
將程式碼做稍為的修改,增加一個茶壺,並且讓橘色茶壺掛在紅色茶壺上
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glColor3ub(255,0,0);///中間紅色的茶壺
glutSolidTeapot(0.3);
glTranslatef(0.4,0.13,0);///4.掛上去
glRotatef(angle, 0,0,1);///3.轉動一個把手在中間的橘色茶壺
glTranslatef(0.45,-0.10,0);///2.把橘色茶壺把手放到中間
glColor3ub(255,127,39);
glutSolidTeapot(0.3);///1.一個橘色的茶壺
glPopMatrix();
glutSwapBuffers();
}
再加一個黃色茶壺
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glColor3ub(255,0,0);///中間紅色的茶壺
glutSolidTeapot(0.3);
glPushMatrix();
glTranslatef(0.4,0.13,0);///4.掛上去
glRotatef(angle, 0,0,1);///3.轉動一個把手在中間的橘色茶壺
glTranslatef(0.45,-0.10,0);///2.把橘色茶壺把手放到中間
glColor3ub(255,127,39);
glutSolidTeapot(0.3);///1.一個橘色的茶壺
glPushMatrix();
glTranslatef(0.4,0.13,0);///4.掛上去
glRotatef(angle, 0,0,1);///3.轉動一個把手在中間的黃色茶壺
glTranslatef(0.45,-0.10,0);///2.把黃色茶壺把手放到中間
glColor3ub(255,255,0);
glutSolidTeapot(0.3);///1.一個黃色的茶壺
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
Week 05 - Part 3 - 3 -茶壺手臂
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glColor3ub(255,255,0);///中間黃色的茶壺
glutSolidTeapot(0.3);
glPushMatrix();///右手臂(綠色)
glTranslatef(0.4,0.13,0);
glRotatef(angle, 0,0,1);
glTranslatef(0.45,-0.10,0);
glColor3ub(0,255,0);
glutSolidTeapot(0.3);
glPushMatrix();///右手肘(藍色)
glTranslatef(0.4,0.13,0);
glRotatef(angle, 0,0,1);
glTranslatef(0.45,-0.10,0);
glColor3ub(0,0,255);
glutSolidTeapot(0.3);
glPopMatrix();
glPopMatrix();
glPushMatrix();///左手臂(橘色)
glTranslatef(-0.4,0.13,0);
glRotatef(-angle, 0,0,1);
glTranslatef(-0.45,-0.10,0);
glColor3ub(255,127,39);
glutSolidTeapot(0.3);
glPushMatrix();///左手肘(紅色)
glTranslatef(-0.4,0.13,0);
glRotatef(-angle, 0,0,1);
glTranslatef(-0.45,-0.10,0);
glColor3ub(255,0,0);
glutSolidTeapot(0.3);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}













沒有留言:
張貼留言