階層性轉動
➤旋轉TRT
#include <GL/glut.h> float angle=0;///NOW void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(255,255,255);///白色的 glutSolidTeapot( 0.3 );///身體 glPushMatrix();///右邊手臂 glTranslatef(0.3, 0, 0);///(3) 掛在身體的右肩 glRotatef(angle, 0,0,1);///(2) 旋轉 glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸 glColor3f(1,0,0);///紅色的 glutSolidTeapot( 0.15 );///右手臂 glPopMatrix(); glutSwapBuffers(); angle++;///NOW } int main(int argc, char**argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH ); glutCreateWindow("week11 TRT"); glutIdleFunc(display);///NOW glutDisplayFunc(display); glutMainLoop(); }
➤加關節
#include <GL/glut.h> float angle=0;///NOW void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(255,255,255);///白色的 glutSolidTeapot( 0.3 );///身體 glPushMatrix();///右邊手臂 glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肩 glRotatef(angle, 0,0,1);///(2) 旋轉 glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸 glColor3f(1,0,0);///紅色的 glutSolidTeapot( 0.15 );///右手臂 glPushMatrix();///NOW2 glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肘///NOW2 glRotatef(angle, 0,0,1);///(2) 旋轉///NOW2 glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2 glColor3f(1,0,0);///紅色的///NOW2 glutSolidTeapot( 0.15 );///右下手臂///NOW2 glPopMatrix();///NOW2 glPopMatrix(); glutSwapBuffers(); angle++;///NOW } int main(int argc, char**argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH ); glutCreateWindow("week11 TRT"); glutIdleFunc(display);///NOW glutDisplayFunc(display); glutMainLoop(); }
➤左半邊手臂
#include <GL/glut.h> float angle=0;///NOW void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(255,255,255);///白色的 glutSolidTeapot( 0.3 );///身體 glPushMatrix();///右邊手臂 glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肩 glRotatef(angle, 0,0,1);///(2) 旋轉 glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸 glColor3f(1,0,0);///紅色的 glutSolidTeapot( 0.15 );///右手臂 glPushMatrix();///NOW2 glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肘///NOW2 glRotatef(angle, 0,0,1);///(2) 旋轉///NOW2 glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2 glColor3f(1,0,0);///紅色的///NOW2 glutSolidTeapot( 0.15 );///右下手臂///NOW2 glPopMatrix();///NOW2 glPopMatrix(); glPushMatrix();///左邊手臂 ///NOW4 複製左半邊 glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肩 ///NOW4 複製左半邊 glRotatef(angle, 0,0,1);///(2) 旋轉///NOW4 複製左半邊 glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW4 複製左半邊 glColor3f(1,0,0);///紅色的 ///NOW4 複製左半邊 glutSolidTeapot( 0.15 );///左手臂 ///NOW4 複製左半邊 glPushMatrix();///NOW2 ///NOW4 複製左半邊 glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肘///NOW2 ///NOW4 複製左半邊 glRotatef(angle, 0,0,1);///(2) 旋轉///NOW2 ///NOW4 複製左半邊 glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2 ///NOW4 複製左半邊 glColor3f(1,0,0);///紅色的///NOW2 ///NOW4 複製左半邊 glutSolidTeapot( 0.15 );///右下手臂///NOW2 ///NOW4 複製左半邊 glPopMatrix();///NOW2 glPopMatrix();///NOW2 glutSwapBuffers(); angle++;///NOW } int main(int argc, char**argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH ); glutCreateWindow("week11 TRT"); glutIdleFunc(display);///NOW glutDisplayFunc(display); glutMainLoop(); }
➤滑鼠控制手臂
#include <GL/glut.h> float angle=0;///NOW void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(255,255,255);///白色的 glutSolidTeapot( 0.3 );///身體 glPushMatrix();///右邊手臂 glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肩 glRotatef(angle, 0,0,1);///(2) 旋轉 glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸 glColor3f(1,0,0);///紅色的 glutSolidTeapot( 0.15 );///右手臂 glPushMatrix();///NOW2 glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肘///NOW2 glRotatef(angle, 0,0,1);///(2) 旋轉///NOW2 glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2 glColor3f(1,0,0);///紅色的///NOW2 glutSolidTeapot( 0.15 );///右下手臂///NOW2 glPopMatrix();///NOW2 glPopMatrix(); glPushMatrix();///左邊手臂 ///NOW4 複製左半邊 glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肩 ///NOW4 複製左半邊 glRotatef(angle, 0,0,1);///(2) 旋轉///NOW4 複製左半邊 glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW4 複製左半邊 glColor3f(1,0,0);///紅色的 ///NOW4 複製左半邊 glutSolidTeapot( 0.15 );///左手臂 ///NOW4 複製左半邊 glPushMatrix();///NOW2 ///NOW4 複製左半邊 glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肘///NOW2 ///NOW4 複製左半邊 glRotatef(angle, 0,0,1);///(2) 旋轉///NOW2 ///NOW4 複製左半邊 glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2 ///NOW4 複製左半邊 glColor3f(1,0,0);///紅色的///NOW2 ///NOW4 複製左半邊 glutSolidTeapot( 0.15 );///右下手臂///NOW2 ///NOW4 複製左半邊 glPopMatrix();///NOW2 glPopMatrix();///NOW2 glutSwapBuffers(); ///angle++;///NOW } void motion(int x,int y){ angle=x; display(); } int main(int argc, char**argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH ); glutCreateWindow("week11 TRT"); glutIdleFunc(display);///NOW glutDisplayFunc(display); glutMotionFunc(motion); glutMainLoop(); }
➤旋轉方向向內
#include <GL/glut.h> float angle=0;///NOW void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(255,255,255);///白色的 glutSolidTeapot( 0.3 );///身體 glPushMatrix();///右邊手臂 glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肩 glRotatef(angle, 0,0,1);///(2) 旋轉 glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸 glColor3f(1,0,0);///紅色的 glutSolidTeapot( 0.15 );///右手臂 glPushMatrix();///NOW2 glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肘///NOW2 glRotatef(angle, 0,0,1);///(2) 旋轉///NOW2 glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2 glColor3f(1,0,0);///紅色的///NOW2 glutSolidTeapot( 0.15 );///右下手臂///NOW2 glPopMatrix();///NOW2 glPopMatrix(); glPushMatrix();///左邊手臂 ///NOW4 複製左半邊 glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肩 ///NOW4 複製左半邊 glRotatef(-angle, 0,0,1);///(2) 旋轉///NOW4 複製左半邊 glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW4 複製左半邊 glColor3f(1,0,0);///紅色的 ///NOW4 複製左半邊 glutSolidTeapot( 0.15 );///左手臂 ///NOW4 複製左半邊 glPushMatrix();///NOW2 ///NOW4 複製左半邊 glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肘///NOW2 ///NOW4 複製左半邊 glRotatef(-angle, 0,0,1);///(2) 旋轉///NOW2 ///NOW4 複製左半邊 glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2 ///NOW4 複製左半邊 glColor3f(1,0,0);///紅色的///NOW2 ///NOW4 複製左半邊 glutSolidTeapot( 0.15 );///右下手臂///NOW2 ///NOW4 複製左半邊 glPopMatrix();///NOW2 glPopMatrix();///NOW2 glutSwapBuffers(); ///angle++;///NOW } int oldX, oldY;///NOW3 用滑鼠mouse來控制angle void motion(int x,int y){ angle += (x-oldX);///NOW3 用滑鼠mouse來控制angle oldX=x;///NOW5 display();///NOW3 用滑鼠mouse來控制angle } void mouse(int button, int state, int x, int y)///NOW5 要知道mouse的按鍵狀況 { oldX = x;///NOW5 要知道mouse的按鍵狀況 } int main(int argc, char**argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH ); glutCreateWindow("week11 TRT"); glutIdleFunc(display);///NOW glutDisplayFunc(display); glutMotionFunc(motion); glutMouseFunc(mouse);///NOW5 要知道mouse的按鍵狀況 glutMainLoop(); }
➤每個關節都可以動
#include <GL/glut.h> float angle1=0, angle2=0, angle3=0, angle4=0;///NOW ///NOW6 配合鍵盤 int jointID=1;///NOW6 配合鍵盤 void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(255,255,255);///白色的 glutSolidTeapot( 0.3 );///身體 glPushMatrix();///右邊手臂 glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肩 glRotatef(angle1, 0,0,1);///(2) 旋轉 ///NOW6 配合鍵盤 glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸 glColor3f(1,0,0);///紅色的 glutSolidTeapot( 0.15 );///右手臂 glPushMatrix();///NOW2 glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肘///NOW2 glRotatef(angle2, 0,0,1);///(2) 旋轉///NOW2 ///NOW6 配合鍵盤 glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2 glColor3f(1,0,0);///紅色的///NOW2 glutSolidTeapot( 0.15 );///右下手臂///NOW2 glPopMatrix();///NOW2 glPopMatrix(); glPushMatrix();///左邊手臂 ///NOW4 複製左半邊 glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肩 ///NOW4 複製左半邊 glRotatef(-angle3, 0,0,1);///(2) 旋轉 ///NOW4 複製左半邊 ///NOW5 angle變負的 glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸 ///NOW4 複製左半邊 glColor3f(1,0,0);///紅色的 ///NOW4 複製左半邊 glutSolidTeapot( 0.15 );///左手臂 ///NOW4 複製左半邊 glPushMatrix();///NOW2 ///NOW4 複製左半邊 glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肘///NOW2 ///NOW4 複製左半邊 glRotatef(-angle4, 0,0,1);///(2) 旋轉///NOW2 ///NOW4 複製左半邊 ///NOW5 angle變負的 glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2 ///NOW4 複製左半邊 glColor3f(1,0,0);///紅色的///NOW2 ///NOW4 複製左半邊 glutSolidTeapot( 0.15 );///左下手臂///NOW2 ///NOW4 複製左半邊 glPopMatrix();///NOW2 glPopMatrix(); glutSwapBuffers(); ///angle++;///NOW ///NOW3 } int oldX, oldY;///NOW5 void motion(int x, int y)///NOW3 用滑鼠mouse來控制angle { if(jointID==1) angle1 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤 if(jointID==2) angle2 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤 if(jointID==3) angle3 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤 if(jointID==4) angle4 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤 oldX=x;///NOW5 display();///NOW3 用滑鼠mouse來控制angle } void mouse(int button, int state, int x, int y)///NOW5 要知道mouse的按鍵狀況 {///NOW5 要知道mouse的按鍵狀況 oldX = x; oldY = y;///NOW5 要知道mouse的按鍵狀況, 按下去時,就記得 oldX } void keyboard(unsigned char key, int x, int y)///NOW6 配合鍵盤 { if(key=='1') jointID=1;///NOW6 配合鍵盤 if(key=='2') jointID=2;///NOW6 配合鍵盤 if(key=='3') jointID=3;///NOW6 配合鍵盤 if(key=='4') jointID=4;///NOW6 配合鍵盤 } int main(int argc, char**argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH ); glutCreateWindow("week11 TRT"); glutIdleFunc(display);///NOW glutDisplayFunc(display); glutMotionFunc(motion);///NOW3 用滑鼠mouse來控制angle glutMouseFunc(mouse);///NOW5 要知道mouse的按鍵狀況 glutKeyboardFunc(keyboard);///NOW6 配合鍵盤 glutMainLoop(); }
沒有留言:
張貼留言