2013年6月18日 星期二

第十六週課堂講解

0. 老師示範
0.1. (a) 乙班鋼鐵人,把T-R-T搞定
0.2. (b) 2人跳舞,用Key調關節轉動

1. 把你的作品開起來, 課堂中嘗試做期末作品
2. 畫座標
3. 將3D模型斷開

學姐小叮嚀:
0. 將程式開好,加咒語,設定tool-edit的Tab
1. 先決定機器人的外貌、形狀,並決定關節的個數
2. 描出每個點的坐標位置,如果是圓的,就要決定圓心
3. 以肚臍為中心,之後調整比較順利
4. 先執行看看,和原來想的位置有沒有跑掉
5. 確定位置就開始分解,試著用TRT移動&轉動
6. 確定轉動&移動順利,就可以開始錄動作
7. 錄動作播放
8. 完成、修改


讀很多關節 rot[10] 的程式範例
FILE *fout=NULL;
FILE *fin=NULL;
void keyboard(unsigned char key, int x, int y)
{
if(key=='0') index=0;
else if(key=='1') index=1;
else if(key=='2') index=2;
else if(key=='3') index=3;
else if(key=='4') index=4;
else if(key=='5') index=5;
if(key=='a') rot[index]++;
else if(key=='A') rot[index]--;
if(key=='s'){
if(fout==NULL) fout=fopen("motion.txt", "w+");
for(int i=0;i<10;i++){
fprintf(fout, "%.1f\t", rot[i]);
}
fprintf(fout, "\n");
}
if(key=='r'){
if(fin==NULL) fin=fopen("motion.txt", "r");
for(int i=0;i<10;i++){
fscanf(fin, "%f", &rot[i]);
printf("%f ",rot[i]);
}
}
for(int i=0;i<10;i++){
printf("%.1f\t",rot[i]);
}
printf("\n");
glutPostRedisplay();
}

可以做內插的程式碼
float rotOld[10]={0,0,0,0,0,0,0,0,0,0};
float rotNew[10]={0,0,0,0,0,0,0,0,0,0};
FILE *fout=NULL;
FILE *fin=NULL;
void player(int t){
if(t%50==0){
for(int i=0;i<10;i++){
rotOld[i]=rotNew[i];
fscanf(fin, "%f", &rotNew[i]);
printf("%f ",rotNew[i]);
}
}
float a= (t%50)*0.02;
for(int i=0;i<10;i++){
rot[i]=rotNew[i]*a + rotOld[i]*(1-a);
}
glutTimerFunc(20, player, t+1);
glutPostRedisplay();
}
void keyboard(unsigned char key, int x, int y)
{
if(key=='0') index=0;
else if(key=='1') index=1;
else if(key=='2') index=2;
else if(key=='3') index=3;
else if(key=='4') index=4;
else if(key=='5') index=5;
if(key=='a') rot[index]++;
else if(key=='A') rot[index]--;
if(key=='s'){
if(fout==NULL) fout=fopen("motion.txt", "w+");
for(int i=0;i<10;i++){
fprintf(fout, "%.1f\t", rot[i]);
}
fprintf(fout, "\n");
}
if(key=='r'){
if(fin==NULL) fin=fopen("motion.txt", "r");
for(int i=0;i<10;i++){
fscanf(fin, "%f", &rot[i]);
printf("%f ",rot[i]);
}
}
if(key=='p'){
if(fin==NULL) fin=fopen("motion.txt", "r");
for(int i=0;i<10;i++){
fscanf(fin, "%f", &rotNew[i]);
printf("%f ",rotNew[i]);
}
glutTimerFunc(100, player, 0);
}
for(int i=0;i<10;i++){
printf("%.1f\t",rot[i]);
}
printf("\n");
glutPostRedisplay();
}

沒有留言:

張貼留言