2020年5月19日 星期二

圖學筆記-12

1.設定

  • 設定檔案
  • 設定目錄:從專案.cbp使用text軟體編輯,將路徑改成"."

這樣就可以把檔案只存在專案資料夾裡


2.套入多個模型

先準備Week10的Al模型(複習)

void drawBody()
{
    if(pmodelA==NULL){
        pmodelA=glmReadOBJ("Al.obj");///執行目錄裡,有個Al.obj檔+Al.mtl檔
        glmUnitize(pmodelA);///設成單位大小
        glmFacetNormals(pmodelA);///重算(面)法向量
        glmVertexNormals(pmodelA, 90);///重算(點)法向量
    }
    glPushMatrix();
        glRotatef(180, 0,1,0);///對Y轉180度,向正面
        glmDraw(pmodelA, GLM_SMOOTH | GLM_MATERIAL);
    glPopMatrix();
}
int angle=30;///設定角度,以便後面做自動旋轉
void drawArm()
{
    if(pmodelB==NULL){
        pmodelB=glmReadOBJ("porsche.obj");///車子的模型
        glmUnitize(pmodelB);
        glmFacetNormals(pmodelB);
        glmVertexNormals(pmodelB, 90);
    }
    glPushMatrix();
        glRotatef(90, 0,1,0);
        glScalef(0.5, 0.5, 0.5);
        glmDraw(pmodelB, GLM_SMOOTH | GLM_MATERIAL);
    glPopMatrix();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    drawBody();
    glPushMatrix();
        glTranslatef(0.5, 0.5, 0);///第3個,TRT
        glRotatef(angle, 0,0,1);///第2個,TRT
        glTranslatef(0.25, 0,0);///第1個,TRT
        drawArm();
    glPopMatrix();
    glutSwapBuffers();
}
成果



3.旋轉


int oldX, oldY;

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

{
    oldX=x;
}
void motion(int x, int y)
{
    angle += (x-oldX);
    oldX=x;
    glutPostRedisplay();
}


void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    ///glutSolidSphere(0.1, 30,30);///原點、圓心
    drawBody();
    glPushMatrix();///右手臂
        glTranslatef(0.5, 0.4, 0);///第3個T
        glRotatef(angle, 0,0,1);///第2個R
        glTranslatef(0.3, 0, 0);///第1個T
        drawArm();///右上手臂
        glPushMatrix();
            glTranslatef(0.25, 0, 0);///第3個T
            glRotatef(angle, 0,0,1);///第2個R
            glTranslatef(0.3, 0, 0);///第1個T
            drawArm();///右下手臂
        glPopMatrix();
    glPopMatrix();

    glPushMatrix();///左手臂
        glTranslatef(-0.5, 0.4, 0);///第3個T
        glRotatef(angle, 0,0,1);///第2個R
        glTranslatef(-0.3, 0, 0);///第1個T
        drawArm();///左上手臂
        glPushMatrix();
            glTranslatef(-0.25, 0, 0);///第3個T
            glRotatef(angle, 0,0,1);///第2個R
            glTranslatef(-0.3, 0, 0);///第1個T
            drawArm();///左下手臂
        glPopMatrix();
    glPopMatrix();


    glutSwapBuffers();
}

main裡面
glutMotionFunc(motion);
    glutMouseFunc(mouse);




4.控制旋轉

可以宣告陣列,然後透過按鍵 0 1 2 3 來控制要旋轉的物件



最後記得在main裡面加上

glutKeyboardFunc(keyboard);


沒有留言:

張貼留言