2024年5月16日 星期四

電腦圖學week13

 ##week13-1_glm_gundam_keyboard_angleID_mouse_motion_angle

先設定好環境

0. freeglut 安裝(拉到桌面),再把 lib的 libfreeglut.a 複製成 libglut32.a

1.安裝OpenCV

2.重開CodeBlocks,Setting-Compiler 要改3個地方

(1)C:\OpenCV2.1\include


(2)C:\OpenCV2.1\lib


(3)cv210 cxcore210 highgui210


接下來再把 GitHub的程式倉庫下載下來,

week12-3_glm_gundam_keyboard_angleID_mouse_motion_angle 拿來改

0.更改目錄名、.cbp檔檔名、Title

(1)week12-3複製目錄,改目錄名為:

week13-1_glm_gundam_keyboard_angleID_mouse_motion_angle

(2)把.cbp檔,改檔名為 

week13-1_glm_gundam_keyboard_angleID_mouse_motion_angle

(3)用Notepad++開.cbp檔,改Title

week13-1_glm_gundam_keyboard_angleID_mouse_motion_angle,並把對應目錄改好

(4)CodeBlocks File-Open 

week13-1_glm_gundam_keyboard_angleID_mouse_motion_angle

 

1.更改程式碼:

```cpp

///float angle = 0, da=1; ///剛剛的舊程式碼

float angle[20]={};///20個角度都改成0

int angleID=0;///可以是角度0、角度1、角度2

int oldX=0,oldY=0;

void motion(int x,int y){///加入mouse motion對應函式

    angle[angleID]=y;///當我們的mouse motion時,y座標 對應角度

    oldX=x;

    oldY=y;

    glutPostRedisplay();

}

void mouse(int button,int state,int x,int y){

    oldX=x;

    oldY=y;

}

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;

}///記得在int main()裡面加glutKeyBoardFunc(keyboard)

void display()

{

```

    glPushMatrix();

        ///glTranslatef(....);///掛在肩上

        glRotatef(angle[0],0,0,1);///(2)z軸轉

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

        drawUpperA();///(3)上手臂放好

        glPushMatrix(); ///加這行, 讓它轉動

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

            glRotatef(angle[1],1,0,0);///(2)z軸轉

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

            drawLowerA();

        glPopMatrix(); ///加這行, 讓它轉動

```

int main(int argc, char*argv[])

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week13-1 Gundam");

    glutDisplayFunc(display);

    glutIdleFunc(display); ///加這行, 讓它轉動

    glutMotionFunc(motion);///滑鼠控制

    glutMotionFunc(motion);///滑鼠控制

   glutKeyboardFunc(keyboard);///week13-1新加的

```





##week13-2_FILE_fopen_fprintf_fscanf

1.把week13-1複製整個目錄,改目錄名、.cbp檔檔名、Notepad++改裡面的Title

2.要加FILE指標

```cpp

#include <stdio.h>

FILE * fin =NULL;

FILE * fout =NULL;

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");

}

```



你執行程式時,用mouse motion 一邊改變角度,一邊產生大量角度值

小黑關掉後可在目錄裡看到angle.txt,裡面就是剛剛印的一堆數值

```cpp

void keyboard(unsigned char key ,int x,int y){

    if(key=='r'){

        if(fout==NULL)    fout=fopen("angle.txt","r");

        for(int i=0;i<20;i++){

        fscanf(fin,"%f",angle[i]);

        }

    glutPostRedisplay();

    }

```



做出鋼彈身體

```cpp

GLMmodel *pmodel = NULL;

GLMmodel *handA = NULL;

GLMmodel *handB = NULL;

GLMmodel *upperA = NULL;

GLMmodel *lowerA = NULL;

GLMmodel *upperB = NULL;

GLMmodel *lowerB = NULL;

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 display()

{


    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glDisable(GL_TEXTURE_2D);

    drawBody();

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

    glEnable(GL_TEXTURE_2D);

    glColor3f(1,1,1);


    glPushMatrix();

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

        glRotatef(angle[0],0,0,1);///(2)z軸轉



轉動模型全身

```cpp

void display()

{


    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glDisable(GL_TEXTURE_2D);


    glPushMatrix();

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

        drawBody();

        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);///(1)

            drawUpperA();///(3)上手臂放好

            glPushMatrix(); ///加這行, 讓它轉動

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

                glRotatef(angle[3],1,0,0);///(2)z軸轉

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

                drawLowerA();

            glPopMatrix(); ///加這行, 讓它轉動

        glPopMatrix();


    glPopMatrix();

    glutSwapBuffers();

}

```










沒有留言:

張貼留言