2024年5月20日 星期一

熱血學圖學round14

準備上課環境
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"會自動播放剛剛的動作


沒有留言:

張貼留言