2015年6月11日 星期四

02160022_翁子喻_week16

今天的課程:
(1)移動、旋轉、縮放
(2)T-R-T及關節
(3)存檔、讀檔、撥放
(4)內插動作Inerploate
(5)期末作業


step one ;要建立"貝殼專案
設定project的bulid option,然後複習上周的進度



執行結果:




step two:是利用鍵盤控制鍵1234作旋轉移動


step three:是存檔和播放


按s存檔動作哦,然後再按p就可以將存檔的動作重複撥放~~~~
這裡就是利用在期末作業的關鍵!!


執行結果:

程式碼:


#include <GL/glut.h>#include <stdio.h> FILE *fout=NULL;FILE *fin=NULL; float angle[8]={0}, oldX=0, oldY=0;int angleID=1;float angleOld[8], angleNew[8]; void drawBody(){ glPushMatrix(); glScalef(1, 0.5, 0.5); glutSolidCube(1); glPopMatrix();}void drawArm(){ glPushMatrix(); glScalef(0.6, 0.3, 0.3); glutSolidCube(1); glPopMatrix();}void display(){ { ///Lighting glColor3ub(166,132,100); GLfloat pos[]={0, 0, -1, 0}; glLightfv(GL_LIGHT0, GL_POSITION, pos); glEnable(GL_LIGHT0); //glEnable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } glPushMatrix(); glTranslatef(0.5, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4 glRotatef(angle[1], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3 glTranslatef(0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2 drawArm();///這是個Arm ver 1 Right Upper Arm glPushMatrix(); glTranslatef(0.25, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4 glRotatef(angle[2], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3 glTranslatef(0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2 drawArm(); ///Right Lower Arm glPopMatrix(); glPopMatrix(); glPushMatrix(); glTranslatef(-0.5, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4 glRotatef(-angle[3], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3 glTranslatef(-0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2 drawArm();///這是個Arm ver 1 Left Upper Arm glPushMatrix(); glTranslatef(-0.25, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4 glRotatef(-angle[4], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3 glTranslatef(-0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2 drawArm(); ///Left Lower Arm glPopMatrix(); glPopMatrix(); drawBody(); glFlush();}void motion(int x, int y){ angle[angleID] -= y - oldY; oldY=y; oldX=x; if(fout==NULL) fout=fopen("a.txt", "w+"); for(int i=0; i<10; i++) { printf("%f\n", angle[i]); fprintf(fout, "%f\n", angle[i]); }}void readNew(){ if(fin==NULL) fin=fopen("a.txt", "r"); for(int i=0; i<8; i++) { angleOld[i]=angleNew[i]; fscanf(fin, "%f", &angleNew[i]); printf("%f \n", angleNew[i]); }}void timerPlay(int t){ glutTimerFunc(20, timerPlay, t+1); float a=(t%50)/50.0; if(t%50==0) readNew(); for(int i=0; i<8; i++) { angle[i]=(1-a)*angleOld[i]+(a)*angleNew[i]; } glutPostRedisplay();}void keyboard(unsigned char key, int x, int y){ if(key=='1') angleID=1; if(key=='2') angleID=2; if(key=='3') angleID=3; if(key=='4') angleID=4; if(key=='p') glutTimerFunc(20, timerPlay, 0); if(key=='s') { if(fout==NULL) fout=fopen("a.txt", "w+"); for(int i=0; i<10; i++) { printf("%f\n", angle[i]); fprintf(fout, "%f\n", angle[i]); } }}void mouse(int button, int state, int x, int y){ if(state==GLUT_DOWN) { oldX=x; oldY=y; }}void timer(int t){ glutTimerFunc(20, timer, t+1); //angle++; glutPostRedisplay();}int main(int argc, char**argv){ glutInit(&argc, argv); glutCreateWindow("T-R-T test"); glutDisplayFunc(display); glutTimerFunc(20, timer, 0); glutMouseFunc(mouse); glutMotionFunc(motion); glutKeyboardFunc(keyboard); glutMainLoop();}



沒有留言:

張貼留言