step01-1
畫一個正方形
```c
#include <GL/glut.h> void display() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glRectf(0.5, 0.5, -0.5, -0.5); glutSwapBuffers(); } int main(int argc, char**argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(600,600); glutCreateWindow("week13 rect TRT"); glutDisplayFunc(display);///不放Idle glutMainLoop(); }
```c
step01-2
正方形上加一個手臂```cvoid display() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glColor3f(1,1,1);///白色的 glRectf(0.5, 0.5, -0.5, -0.5);///身體 glPushMatrix(); ///glTranslatef( x, y, z);///等下要掛在0.5,0.5 ///glRotatef(angle, 0, 0, 1);//z軸 ///glTranslatef( x2, y2, z2);///???? glColor3f(1,0,0);///紅色的 glRectf(0.5, 0.5, 1.0, 0.3);///手臂 glPopMatrix(); glutSwapBuffers(); }```cstep01-3
找出T-R-T的旋轉中心```cfloat angle=45; void display() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glColor3f(1,1,1);///白色的 glRectf(0.5, 0.5, -0.5, -0.5);///身體 glPushMatrix(); ///glTranslatef( x, y, z);///等下要掛在0.5,0.5 glRotatef(angle, 0, 0, 1);///(2) 旋轉 glTranslatef( -0.5, -0.4, 0);///(1)先把旋轉中心放正中心 glColor3f(1,0,0);///紅色的 glRectf(0.5, 0.5, 1.0, 0.3);///手臂 glPopMatrix(); glutSwapBuffers(); }```cstep02-1
希望手臂可以利用mouse motion來揮動, 所以加上mouse() 及 motion() 函式, 並在 main()裡 設定好這兩個函式。在做動畫時, 通常做出的人體會2手張開, 擺成 T pose。人體站直, z在0的位置```c#include <GL/glut.h> float angle=45, oldX=0; void mouse(int button, int state, int x, int y){///mouse按下去 oldX = x; } void motion(int x, int y){ angle += (x-oldX); oldX = x; glutPostRedisplay(); } void display() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glColor3f(1,1,1);///白色的 glRectf(0.5, 0.5, -0.5, -0.5);///身體 glPushMatrix(); glTranslatef( 0.5, 0.5, 0);///(3) 等下要掛在0.5,0.5 glRotatef(angle, 0, 0, 1);///(2) 旋轉 glTranslatef( -0.5, -0.4, 0);///(1)先把旋轉中心放正中心 glColor3f(1,0,0);///紅色的 glRectf(0.5, 0.5, 1.0, 0.3);///手臂 glPopMatrix(); glutSwapBuffers(); } int main(int argc, char**argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); ///glutInitWindowSize(600,600); glutCreateWindow("week13 rect TRT"); glutMouseFunc(mouse); glutMotionFunc(motion); glutDisplayFunc(display);///不放Idle glutMainLoop(); }```cstep02-2
畫下手肘(剛剛太胖要瘦身)```cvoid display() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glColor3f(1,1,1);///白色的 glRectf(0.3, 0.5, -0.3, -0.2);///身體,瘦身 glPushMatrix(); ///掛的位置也改了 glTranslatef( 0.3, 0.5, 0);///(3) 等下要掛在0.5,0.5 ///glRotatef(angle, 0, 0, 1);///(2) 旋轉 glTranslatef( -0.3, -0.4, 0);///(1)先把旋轉中心放正中心 glColor3f(1,0,0);///紅色的 glRectf(0.3, 0.5, 0.8, 0.3);///上手臂 glPopMatrix(); glutSwapBuffers(); }```cstep02-3
畫出下手臂,再重下到上早出T-R-T```cvoid display() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glColor3f(1,1,1);///白色的 glRectf(0.3, 0.5, -0.3, -0.2);///身體,瘦身 glPushMatrix(); ///掛的位置也改了 glTranslatef( 0.3, 0.5, 0);///(3) 等下要掛在0.5,0.5 ///glRotatef(angle, 0, 0, 1);///(2) 旋轉 glTranslatef( -0.3, -0.4, 0);///(1)先把旋轉中心放正中心 glColor3f(1,0,0);///紅色的 glRectf(0.3, 0.5, 0.8, 0.3);///上手臂 glPushMatrix(); glTranslatef(0.8, 0.4, 0); ///(3) 把下手肘掛在關節上 glRotatef( angle, 0, 0, 1); ///(2) 旋轉 glTranslatef(-0.8, -0.4, 0 );///(1) 把下手肘的旋轉中心,放正中心 glColor3f(0,1,0);///綠色的 glRectf(0.8, 0.5, 1.1, 0.3);///再畫下手肘 glPopMatrix(); glPopMatrix(); glutSwapBuffers(); }```cstep03-1
利用 keyboard 來指定要轉動的關節(最終程式碼)```c#include <GL/glut.h> float angle[20], oldX=0; int angleID=0;///0:第0個關節, 1:第1個關節, 2:第2個關節 void keyboard( unsigned char key, int x, int y){ if( key=='0' ) angleID=0;///預設是這一個 if( key=='1' ) angleID=1; if( key=='2' ) angleID=2; if( key=='3' ) angleID=3; }///用keyboard的按鍵,來決定等一下 motion()裡要改的 angle[i] 是哪一個 void mouse(int button, int state, int x, int y){///mouse按下去 oldX = x; } void motion(int x, int y){ angle[angleID] += (x-oldX); oldX = x; glutPostRedisplay(); } void display() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glColor3f(1,1,1);///白色的 glRectf(0.3, 0.5, -0.3, -0.2);///身體,瘦身 glPushMatrix(); ///右半邊 glTranslatef( 0.3, 0.5, 0);///(3) 等下要掛在0.5,0.5 glRotatef( angle[0], 0, 0, 1);///(2) 旋轉 glTranslatef( -0.3, -0.4, 0);///(1)先把旋轉中心放正中心 glColor3f(1,0,0);///紅色的 glRectf(0.3, 0.5, 0.8, 0.3);///右上手臂 glPushMatrix(); glTranslatef(0.8, 0.4, 0); ///(3) 把下手肘掛在關節上 glRotatef( angle[1], 0, 0, 1); ///(2) 旋轉 glTranslatef(-0.8, -0.4, 0 );///(1) 把下手肘的旋轉中心,放正中心 glColor3f(0,1,0);///綠色的 glRectf(0.8, 0.5, 1.1, 0.3);///再畫右下手肘 glPopMatrix(); glPopMatrix(); glPushMatrix(); ///左半邊 glTranslatef( -0.3, 0.5, 0);///(3) 等下要掛在0.5,0.5 glRotatef( angle[2], 0, 0, 1);///(2) 旋轉 glTranslatef( +0.3, -0.4, 0);///(1)先把旋轉中心放正中心 glColor3f(1,0,0);///紅色的 glRectf(-0.3, 0.5, -0.8, 0.3);///左上手臂 glPushMatrix(); glTranslatef(-0.8, 0.4, 0); ///(3) 把下手肘掛在關節上 glRotatef( angle[3], 0, 0, 1); ///(2) 旋轉 glTranslatef(+0.8, -0.4, 0 );///(1) 把下手肘的旋轉中心,放正中心 glColor3f(0,1,0);///綠色的 glRectf(-0.8, 0.5, -1.1, 0.3);///再畫左下手肘 glPopMatrix(); glPopMatrix(); glutSwapBuffers(); } int main(int argc, char**argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); ///glutInitWindowSize(600,600); glutCreateWindow("week13 rect TRT"); glutKeyboardFunc(keyboard); glutMouseFunc(mouse); glutMotionFunc(motion); glutDisplayFunc(display);///不放Idle glutMainLoop(); }```c
沒有留言:
張貼留言