2024年5月16日 星期四

C~電腦圖學日誌 Week13

Week13


week13-1_glm_gundam_keyboard
_angleID_mouse_motion_angle

1. 安裝freeglut,複製libfreeglut.a改成libglut32.a

2. 下載OpenCV選第2或3選項別選第1個

3. 安裝在預設的目錄,重開CodeBlocks(讓編譯器讀到檔案)

3.0 去設定 Settings->Compiler 要加3個設定

3.1 search目錄 Compiler的 include目錄  加C:\OpenCV2.1\include

3.2 search目錄 Linker 的 lib目錄  加C:\OpenCV2.1\lib

3.3 加入Linker設定的 3個檔名 cv210 cxcore210 highgui210

4. 將week12-3_glm_gundam_keyboard_angleID_mouse_motion_angle
    改成
week13-1_glm_gundam_keyboard_angleID_mouse_motion_angle


5. 新增用鍵盤控制旋轉關節
註解掉//float angle = 0, da = 1;
float angle[20] = {};///設20個角度
int angleID = 0;///當個角度的index
void motion(int x, int y){
    angle[angleID] = y;
    glutPostRedisplay();///要重畫畫面
}
void keyboard(unsigned char key, int x,int y){
    if(key=='0') angleID = 0;
    if(key=='1') angleID = 1;
    if(key=='2') angleID = 2;
    if(key=='3') angleID = 3;
}
void display(){
      中的angle改成angle[0]
                               
angle[1]
}
int main(){
glutKeyboardFunc(keyboard);///week13用鍵盤控制哪個關節轉動
}

6. 讓轉動變滑順






week13-2_FILE_fopen_fprintf_fscanf

輸出用滑鼠改變的角度,並生成angle.txt的檔案來記錄

1. 將week13-1_glm_gundam_keyboard_angleID_mouse_motion_angle
    改成
week13-2_FILE_fopen_fprintf_fscanf

2. 加FILE指標
‵‵‵cpp
FILE * fin = NULL;
FILE * fout = NULL;
‵‵‵

3. motion()修改
void motion(int x, int y){
    angle[angleID] += y-oldY;
    oldX = x;
    oldY = y;
    glutPostRedisplay();///要重畫畫面
    if(fout==NULL) fout = fopen("angle.txt", "w+");
    for(int i=0;i<20;i++){
        printf("%.1f ",angle[i] );
        fprintf(fout,"%.1f ",angle[i] );
    }
    printf("\n");
    fprintf(fout,"\n");
}


4. 要讀檔案 
angle.txt(要有空格)
長按R鍵 會讀取txt檔案中的座標並進行轉動

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<20;i++){
            fscanf(fin,"%f", &angle[i] );
        }
        glutPostRedisplay();
    }
    if(key=='0') angleID = 0;
    if(key=='1') angleID = 1;
    if(key=='2') angleID = 2;
    if(key=='3') angleID = 3;
}




5. 新增鋼彈身體

GLMmodel * body = NULL;
void drawBody(void)
{
    if (!body) {
body = glmReadOBJ("data/body.obj");
if (!body) exit(0);
glmUnitize(body);
glmFacetNormals(body);
glmVertexNormals(body, 90.0);
    }

    glmDraw(body, GLM_SMOOTH | GLM_TEXTURE);
}

void dispaly(){
修改
drawBody();///畫剛彈身體

glTranslatef(-0.1, 0, 0);///掛在肩上
}




7. 改成控制4個關節點 

void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glDisable(GL_TEXTURE_2D);

    glPushMatrix();
        glRotatef(angle[0], 0, 1, 0);
        drawBody();///畫剛彈身體
        //glutSolidSphere(0.1, 30, 30);///關節點
        glEnable(GL_TEXTURE_2D);
        glColor3f(1, 1, 1);

        glPushMatrix();
            glTranslatef(-0.1, 0, 0);///掛在肩上
            glRotatef(angle[1], 0, 0, 1);
            glRotatef(angle[2], 1, 0, 0);
            glTranslatef(0, -0.07, 0);
            drawUpperA();
            glPushMatrix();
                glTranslatef(-0.02, -0.09, 0);///(3)掛到上手臂上
                glRotatef(angle[3], 1, 0, 0);///(2)x軸轉
                glTranslatef(0, -0.21, 0);///(1)
                drawLowerA();///
            glPopMatrix(); ///
        glPopMatrix(); ///
    glPopMatrix();
    glutSwapBuffers();
}





Github



沒有留言:

張貼留言