複習上周的「移動-旋轉」與「旋轉-移動」
1. 下載範例網頁中的data, win32
旋轉函式glRotatef()和移動函式glTranslatef()在程式碼中的順序會影響執行的結果
在以下的程式碼中: 綠色和紅色茶壺的運動分別將移動與旋轉調換 其運動方式也不同
在以下的程式碼中: 綠色和紅色茶壺的運動分別將移動與旋轉調換 其運動方式也不同
```
#include <GL/glut.h>
float angle = 0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);///紅
glPushMatrix();
glRotatef(angle,0,0,1);
glTranslatef(0.8, 0, 0);///移動到0.8
glutSolidTeapot(0.3);
glPopMatrix();
///紅色茶壺會以中心點為圓心 0.8為半徑公轉
glColor3f(0,1,0);///綠
glPushMatrix();
glTranslatef(0.8, 0, 0);///移動到0.8
glRotatef(angle*1.5,0,0,1);
glutSolidTeapot(0.3);
glPopMatrix();
///綠色茶壺會移動到0.8後自轉
glutSwapBuffers();
angle++;
}
int main(int argc, char** argv)
{
glutInit( &argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week_02");
glutDisplayFunc(display);
glutMainLoop();
}
```「移動-旋轉-移動」(TRT)
使用老師的Opengl TRT demo程式:
按下ToDraw開始繪圖,拖動程式碼可以移動它的位置
先繪製出大致的人型與一條手臂
先繪製出大致的人型與一條手臂
TRT原理:
先將關節移動到原點glTranslatef(-0.18,-0.41,0),加上轉動軸後glRotatef(angle,0,0,1),再將轉動圓心放回指定點glTranslatef(0.18,0.41,0)。
以glut程式實作:
```
#include <GL/glut.h>
float angle = 0;
void myCube()
{
glPopMatrix();
glScalef(0.5,0.2,0.2);///調大小
glutSolidCube(1); ///正方形
glPopMatrix();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1);
glutSolidCube(1);
glPushMatrix();
glTranslatef(-0.25, 0, 0);
glRotatef(angle,0,0,1);
glTranslatef(0.25, 0, 0);
glColor3f(0,1,0);
myCube();
glPopMatrix();
glutSwapBuffers();
angle++;
}
int main(int argc, char** argv)
{
glutInit( &argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week_05");
glutDisplayFunc(display);
glutMainLoop();
}
```
沒有留言:
張貼留言