準備上課環境
0. freeglut
1. 安裝OPENCV
2. Setting_Compiler 有3個設定
檔名:week14-1_angle_motion_save把上週week13-3的檔案下載下來改檔名,.cbp檔開啟Notepad++做修改
將原本的程式修改為:
'''cpp
int angleID=0;
float angleX[10]={};
float angleY[10]={};///mouse motion時,可同時更改1個關節的2轉動
void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glutSolidSphere(0.1,30,30);
/*glTranslatef(-0.3,0.3,0);///(3)
glRotatef(angle++,1,0,0);///(2)旋轉
glTranslatef(-0.15,-0.25,0);///(1)
drawarml(); ///glutSolidTeapot( 0.3 );
glPopMatrix();
glPushMatrix();
glTranslatef(0.6,0.3,0);///(3)
glRotatef(angle++,1,0,0);///(2)旋轉
glTranslatef(-0.15,-0.25,0);///(1)*/
glPushMatrix();
glRotatef(180, 0, 1, 0);
glRotatef(angleX[0],1,0,0);
glRotatef(angleY[0],0,1,0);
drawbody();
//glPopMatrix();
glPushMatrix();
glTranslatef(-0.2,0.1,0);
glRotatef(angleX[1],1,0,0);
glRotatef(angleY[1],0,1,0);
glTranslatef(0,-0.05,0);
drawUpper();
glPushMatrix();
glTranslatef(0,-0.1,0);
glRotatef(angleX[2],1,0,0);///讓手臂在0-90度之間來回彈動
glRotatef(angleY[2],0,1,0);
glTranslatef(0,-0.2,0);
drawLower(); ///glutSolidTeapot( 0.3 );
glPopMatrix();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
'''
'''cpp
void keyboard(unsigned char key,int x,int y){
if(key=='r'){
if(fin==NULL) fin=fopen("angle.txt","r");
for(int i=0;i<10;i++){
fscanf(fin,"%f",&angleX[i]);
fscanf(fin,"%f",&angleY[i]);
}
glutPostRedisplay;
}
if(key=='s'){
if(fout==NULL) fout=fopen("angle.txt","w+");
for(int i=0;i<10;i++){
printf("%.1f ",angleX[i]);
fprintf(fout,"%.1f ",angleX[i]);
printf("%.1f ",angleY[i]);
fprintf(fout,"%.1f ",angleY[i]);
}
printf("\n");
fprintf(fout,"\n");
}
if(key=='0') angleID=0;
if(key=='1') angleID=1;
if(key=='2') angleID=2;
if(key=='3') angleID=3;
}
'''
'''cpp
void motion(int x,int y){
angleX[angleID]+=y-oldY;
angleY[angleID]+=x-oldX;
oldX=x;
oldY=y;
glutPostRedisplay();
}
'''
檔案二:week14-2_alpha_blending
1.複製week14-1變成week14-2_alpha_blending
2.改.cbp的檔名&開啟Notepad++做修改
3.開啟Excel檔!輸入一些資料,套用公式
📐alpha: =左邊座標/20
📐內插結果: =新的*alpha+舊的*(1-alpha)
'''cpp
void timer(int t);///函式形狀宣告
void keyboard(unsigned char key,int x,int y){
if(key=='p'){///Play播放
glutTimerFunc(0,timer,0);
}
if(key=='r'){///Read讀資料
if(fin==NULL) fin=fopen("angle.txt","r");
for(int i=0;i<10;i++){
fscanf(fin,"%f",&angleX[i]);
fscanf(fin,"%f",&angleY[i]);
}
glutPostRedisplay;
}
if(key=='s'){///Save存資料
if(fout==NULL) fout=fopen("angle.txt","w+");
for(int i=0;i<10;i++){
printf("%.1f ",angleX[i]);
fprintf(fout,"%.1f ",angleX[i]);
printf("%.1f ",angleY[i]);
fprintf(fout,"%.1f ",angleY[i]);
}
printf("\n");
fprintf(fout,"\n");
}
if(key=='0') angleID=0;
if(key=='1') angleID=1;
if(key=='2') angleID=2;
if(key=='3') angleID=3;
}
'''
'''cpp
float oldAngleX[10]={};
float oldAngleY[10]={};
float newAngleX[10]={};
float newAngleY[10]={};
void timer(int t){
glutTimerFunc(50,timer,t+1);
if(fin==NULL) fin=fopen("angle.txt","r");
if(t%20==0){
for(int i=0;i<10;i++){
oldAngleX[i]=newAngleX[i];
oldAngleY[i]=newAngleY[i];
fscanf(fin,"%f",&newAngleX[i]);
fscanf(fin,"%f",&newAngleY[i]);
}
}
float alpha=(t%20)/20.0;
for(int i=0;i<10;i++){
angleX[i]=alpha*newAngleX[i]+(1-alpha)*oldAngleX[i];
angleY[i]=alpha*newAngleY[i]+(1-alpha)*oldAngleY[i];
}
glutPostRedisplay();
}
'''
⭐先用"s"存動作後再按"p"會自動播放剛剛的動作
沒有留言:
張貼留言