2021年6月9日 星期三

本人發言不代表本人立場 week16

今日主題:動畫、存讀檔

1. 改程式碼

  • 把上週程式拿來這週用
  • 把timer的程式拿掉改用mouse motion
int oldx=0;
void mouse(int botton,int x,int y){
    oldx=x;
}
void motion(int x,int y){
    angle[angleID]+= x-oldx;
    oldx=x;
    glutPostRedisplay();
}  

配合main函式的glutMotionFunc(motion);

執行結果: 


















2. 動畫、存檔

  • 加上指標 FILE * fout = NULL;
  • 在motion增加:    
if(fout==NULL)fout=fopen("angle.txt","w+");
for(int i=0;i<20;i++) fprintf(fout,"%.1f ",angle[i]);
fprintf(fout,"\n");
for(int i=0;i<20;i++) printf("%.1f ",angle[i]);
printf("\n");

執行結果:







  • 加上timer
  • 先加上指標 FILE * fin = NULL

glutTimerFunc(30,timer,t+1);
if(fin==NULL) fin=fopen("angle.txt","r");
for(int i=0;i<20;i++) fscanf(fin,"%f",&angle[i]);
glutPostResisplay();

  • 先註解timer跟存檔的程式碼
  • 加上 's' 'r' 'p' key 代表 'save' 'read' 'play'
  • 把 fout 的程式碼貼在 key[s]

if(key=='s'){///save
        if(fout==NULL)fout=fopen("angle.txt","w+");
        for(int i=0;i<20;i++) fprintf(fout,"%.1f ",angle[i]);
        fprintf(fout,"\n");
        for(int i=0;i<20;i++) printf("%.1f ",angle[i]);
        printf("\n");
}

  • 把 fopen 的程式碼貼在 key[r]

if(key=='r'){///read
        if(fin==NULL) fin=fopen("angle.txt","r");
        for(int i=0;i<20;i++)fscanf(fin,"%f",&angle[i]);
        glutPostRedisplay();
}


3. 內插

  • 改timer
float angleold[20]={},anglenew[20]={};
void timer( int t ){
    glutTimerFunc(30,timer,t+1);
    if(t%10==0){///10frame 讀新資料
        for(int i=0;i<20;i++) angleold[i]=anglenew[i];///備份資料
        if(fin==NULL) fin=fopen("angle.txt","r");
        for(int i=0;i<20;i++)fscanf(fin,"%f",&anglenew[i]);///讀新資料
    }
    float alpha = (t%10)/10.0;
    for(int i=0;i<20;i++){
        angle[i]=alpha*anglenew[i]+(1-alpha)*angleold[i];
    }
    glutPostRedisplay();
}

就會跑出動畫了(原理 to be continue)

沒有留言:

張貼留言

距地表面160 Week11

 #include "glm.h" GLMmodel* pmodel = NULL; void drawmodel(void) {     if (!pmodel) { pmodel = glmReadOBJ("data/porsche.obj...