2024年5月9日 星期四

C~電腦圖學日誌 Week12

Week12模型的關節轉動


week12-1_glm_gundam_opencv_texture_lighting

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

2. 新增GLUT專案取名成week11-0_sample

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

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

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

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

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

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

5. 將week11-2_glm_gundam_opencv_texture_lighting
    改成
week12-1_glm_gundam_handA_handB
    

6. 把紅色身體註解,並新增一個圓當關節,並移動手

glutSolidSphere(0.1, 30, 30);

glTranslatef(0, -0.3, 0);///(1)把旋轉軸放正中心

glRotatef(angle++, 0, 0, 1);///(2)對Z軸轉


7. 把handB也加上





week12-2_glm_gundam_upper_lower

用Maya切割出上下手臂(左手)、匯出OBJ檔

1. 把upperA.obj、upperA.mtl 、lowerA.obj、lowerA.mtl    放到data資料夾

2. 複製week12-1_glm_gundam_handA_handB改成week12-2_glm_gundam_upper_lower

3. 加程式碼

GLMmodel * upperA = NULL;

GLMmodel * lowerA = NULL;

void drawUpperA(void)

{

    if (!upperA) {

upperA = glmReadOBJ("data/upperA.obj");

if (!upperA) exit(0);

glmUnitize(upperA);

glmFacetNormals(upperA);

glmVertexNormals(upperA, 90.0);

    }


    glmDraw(upperA, GLM_SMOOTH | GLM_TEXTURE);

}

void drawLowerA(void)

{

    if (!lowerA) {

lowerA = glmReadOBJ("data/lowerA.obj");

if (!lowerA) exit(0);

glmUnitize(lowerA);

glmFacetNormals(lowerA);

glmVertexNormals(lowerA, 90.0);

    }


    glmDraw(lowerA, GLM_SMOOTH | GLM_TEXTURE);

}



4. 將下手臂裝到上手臂並以X軸轉 


5. 設if讓手擺動角度變合理

float angle = 0, da = 1;

void display()

{

    angle+=da;

    if(angle > 90) da = -1;

    if(angle < 0) da = +1;

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glDisable(GL_TEXTURE_2D);

    ///myBody();

    ///glutSolidSphere(0.1, 30, 30);

    glEnable(GL_TEXTURE_2D);

    glColor3f(1, 1, 1);


    drawUpperA();

    glPushMatrix(); ///

        glTranslatef(-0.02, -0.09, 0);///(3)掛到上手臂上

        glRotatef(angle, 1, 0, 0);///(2)x軸轉

        glTranslatef(0, -0.21, 0);///(1)

        drawLowerA();///

    glPopMatrix(); ///



    glutSwapBuffers();

}


week12-3_glm_gundam

_keyboard_angleID_mouse_motion_angle

用Maya切割出上下手臂(左手)、匯出OBJ檔

1. 複製week12-2_glm_gundam_upper_lower改成week12-3_glm_gundam
_keyboard_angleID_mouse_motion_angle

2. 加程式碼,用滑鼠Y座標控制轉動角度
float angle = 0, da = 1;
void motion(int x, int y){
    angle = y;
}

glutMotionFunc(motion);



3. 新增一層來控制上手臂的關節

    glPushMatrix();

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

        glRotatef(angle, 0, 0, 1);

        glTranslatef(0, -0.07, 0);

        drawUpperA();

        glPushMatrix();

            glTranslatef(-0.02, -0.09, 0);///(3)掛到上手臂上

            ///glRotatef(angle, 1, 0, 0);///(2)x軸轉

            glTranslatef(0, -0.21, 0);///(1)

            drawLowerA();///

        glPopMatrix(); ///


    glPopMatrix(); ///


Github







沒有留言:

張貼留言