2024年5月20日 星期一

小韓電腦圖學日誌 week14

先準備上課環境

0. 安裝 freeglut 目錄

1. 安裝openCV 要add path

2. 設定codeblocks complier

## week14-1_angle_motion_save (複製13-3的程式碼)

float angleX[10] = {};

float angleY[10] = {};///mouse motion時,可同時改2個軸的轉動

void display()

{

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glPushMatrix();///加入旋轉

        glRotatef(180,0,1,0);

        glRotatef(angleX[0],1,0,0);

        glRotatef(angleX[1],0,1,0);

        drawBody(); 身體

        glPushMatrix();

            glTranslatef(-0.15,0,0);

            glRotatef(angleX[1],1,0,0);

            glRotatef(angleY[1],0,1,0);

            glTranslatef(-0.025,-0.05,0);

            drawUpper();上手臂

        glPushMatrix();

            glTranslatef(0,-0.1,0);

            glRotatef(angleX[2],1,0,0);

            glRotatef(angleY[2],0,1,0);

            glTranslatef(0,-0.2,0);

            drawLower(); 下手臂

        glPopMatrix();

    glPopMatrix();

    glPopMatrix();

    glutSwapBuffers();

}

設定angleX 跟angleY 可以同時改兩個軸轉動



按 0 1 2 鍵,可以分別對身體、上手臂、下手臂轉動

## week14-2_alpha_blending

複製14-1的程式碼
開啟excel 檔案


alpha 0~1的公式 =A2/20
內插結果的公式是 =D2*B2+C2*(1-B2)
內插結果 新的*alpha+ 舊的*(1-alpha)   如果alpha 是0是舊的 alpha是1是新的
現在要寫程式碼來算內插結果 

加了Timer計時器 設定每秒都會呼叫一次
void timer(int t){ ///week12
    glutTimerFunc(1000,timer,t+1);
    printf("你呼叫了timer(%d)\n",t);///week12
}



前面要 void timer(int t);///函式的形狀宣告 
加入if(key=='p'){ ///play播放
        glutTimerFunc(0,timer,0);
        }
一開始不會馬上執行,按 p 鍵才會開始跳timer


加入這些程式 先按s可以儲存動作(座標)  按 p 就會照著剛剛儲存的動作去運作
void timer(int t){ ///week12
    glutTimerFunc(50,timer,t+1);  1000ms = 一秒  50ms代表在一秒內完成20個動作
    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();
    printf("你呼叫了timer(%d)\n",t);///week12
}


##上傳github









沒有留言:

張貼留言