2015年5月27日 星期三

厚翔:期末作品教學

小葉老師非常用心  一步一步教我們如何做出最完美的期末作業

期末作業的主題是一個會跳舞的機器人

todo:1)期末作業 2)會跳舞的機器人 3)T-R-T關節旋轉 4)作業問題示範解說 5)臨時小考:T-R-T觀念

第一節課:
前半段先給我們看以前學長姐所做的期末作品

再來利用Window.zip的Transformation.exe跑出一個3D人偶模型  然後把人偶的手當作軸心懸轉


為了本周的臨時小考老師還是以最基本的茶壺作範例

語法:

#include <GL/glut.h>
void display()
{
    GLfloat pos[]={0, 0, -1, 0};
    glLightfv(GL_LIGHT0, GL_POSITION, pos);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);//打光
    glEnable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glutSolidTeapot(0.3);
    glFlush();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("TRT");
//小練習
    glutDisplayFunc(display);
    glutMainLoop();
}




第二節課:

正式進入今天的主題

首先依照慣例看了學長姊的影片

再來老師就要教我們怎麼使用關節做旋轉



語法:
#include <GL/glut.h>
float angle=0;
void display()
{
    GLfloat pos[]={0, 0, -1, 0};
    glLightfv(GL_LIGHT0, GL_POSITION, pos);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);//打光
    glEnable(GL_DEPTH_TEST);
    
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();
        glTranslatef(0.6, 0.2, 0);//final把旋轉物體掛在固定物體上(4)
        glRotatef(angle, 0,0,1);//把整團對之間作旋轉(3)
        glTranslatef(0.3, 0,0);//把茶壺往右移 茶柄變中間(2)
        glutSolidTeapot(0.3);//一個茶壺(1)
    glPopMatrix();


    glutSolidTeapot(0.3);//body
    glFlush();
}
void timer(int t)
{
    glutTimerFunc(20, timer, t+1);
    angle++;
    glutPostRedisplay();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("TRT");//小練習
    glutDisplayFunc(display);
    glutTimerFunc(20, timer, 0);

    glutMainLoop();

}



再來老師要教一樣的東西 只是東西換成方塊  而且這是小考題目!!!


#include <GL/glut.h>
float angle=0;
void drawBody()//固定物體大小
{
    glPushMatrix();
    glScalef(1, 0.5, 0.5);
    glutSolidCube(1);
    glPopMatrix();
}
void drawArm()//旋轉物體大小
{
    glPushMatrix();
    glScalef(0.6, 0.3, 0.3);
    glutSolidCube(1);
    glPopMatrix();
}
void display()
{
    GLfloat pos[]={0, 0, -1, 0};
    glLightfv(GL_LIGHT0, GL_POSITION, pos);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);//打光
    glEnable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();
        glTranslatef(0.5, 0.25, 0);//final把旋轉物體掛在固定物體上(4)
        glRotatef(angle, 0,0,1);//對Z軸做旋轉
        glTranslatef(0.3, 0,0);//把茶壺往右移 茶柄變中間(2)
        drawArm();//一個方塊
    glPopMatrix();

    drawBody();//body
    glFlush();
}
void timer(int t)
{
    glutTimerFunc(20, timer, t+1);
    angle++;
    glutPostRedisplay();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("TRT");//小練習
    glutDisplayFunc(display);
    glutTimerFunc(20, timer, 0);

    glutMainLoop();

}


這些東西可以利用在期末作業的關節上



最後小葉老師教了進階的雙關節 並且可以手動!!!!!

一樣是利用剛剛的語法  只是加上了滑鼠跟多一個關節

#include <GL/glut.h>
float angle=0, oldX=0, oldY=0;
void drawBody()
{
    glPushMatrix();
    glScalef(1, 0.5, 0.5);
    glutSolidCube(1);
    glPopMatrix();
}
void drawArm()
{
    glPushMatrix();
    glScalef(0.6, 0.3, 0.3);
    glutSolidCube(1);
    glPopMatrix();
}
void display()
{
    
    GLfloat pos[]={0, 0, -1, 0};
    glLightfv(GL_LIGHT0, GL_POSITION, pos);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);//打光
    glEnable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    glPushMatrix();
        glTranslatef(0.5, 0.25, 0);//final把旋轉物體掛在固定物體上(4)
        glRotatef(angle, 0,0,1);//對Z軸做旋轉
        glTranslatef(0.25, 0,0);//把茶壺往右移 茶柄變中間(2)
        drawArm();//一個方塊
        glPushMatrix();//多召喚一個移動方塊
            glTranslatef(0.25, 0, 0);
            glRotatef(angle, 0,0,1);
            glTranslatef(0.25, 0,0);
            drawArm();//一個方塊
        glPopMatrix();
    glPopMatrix();
    drawBody();//body
    glFlush();
}
void motion(int x, int y) //配合滑鼠移動
{
    angle -= y - oldY;
    oldY=y; oldX=x;
}
void mouse(int button, int state, int x, int y)
{
    if(state==GLUT_DOWN) {oldX=x; oldY=y;}
}
void timer(int t)
{
    glutTimerFunc(20, timer, t+1);
    angle++;
    glutPostRedisplay();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("TRT");//小練習"
    glutDisplayFunc(display);
    glutTimerFunc(20, timer, 0);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);

    glutMainLoop();

}

今天教的就是這樣瞜


沒有留言:

張貼留言