2020年4月21日 星期二

week08-水古戰剛結束,ㄅㄑ天尊回來啦

今天預定要做的行程:
電腦圖學 第08週 2020-04-21
1. 期中考: OpenGL必背10函式 (老師有模擬考系統 http://120.96.99.55 )
2. 主題: glu/glut函式
4. 階層式移動、階層式轉動
5. T-R-T (像關節一樣的)轉動
6. 下週小考(機器人的關節轉動)、下下週交作業(簡單的機器人)
-----------------------------------------------------------------------------------------------------
將一個物品旋轉:
#include<Gl/glut.h>
void upper_arm()
{
    glPushMatrix();///備份矩陣
        glScalef(1,0.3,0.3);
        glutSolidCube(0.5);
    glPopMatrix();///還原矩陣
}
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///備份
    glRotatef(angle,0,0,1);///對z軸旋轉
    upper_arm();///函式呼叫
    glPopMatrix();///還原矩陣
    angle++;///角度增加
    glutSwapBuffers();
}
int main(int argc,char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week09-1");
    glutIdleFunc(display);
    glutDisplayFunc(display);
    glutMainLoop();
}
--------------------------------------------------------------------------------------------------------------------------
但是我是想要讓物品的一端為圓心旋轉,於是再多一行:

#include<Gl/glut.h>
void upper_arm()
{
    glPushMatrix();///備份矩陣
        glScalef(1,0.3,0.3);
        glutSolidCube(0.5);
    glPopMatrix();///還原矩陣
}
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///備份
    glRotatef(angle,0,0,1);///對z軸旋轉
---------    
glTranslatef(0.25,0,0);///將整個物品做移動
    ///世界是固定的,旋轉是以世界的中心點旋轉=>
    ///把物件的一端移動到世界的中心點->成功以一端為圓心旋轉
--------
    upper_arm();///函式呼叫
    glPopMatrix();///還原矩陣
    angle++;///角度增加
    glutSwapBuffers();
}
int main(int argc,char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week09-1");
    glutIdleFunc(display);
    glutDisplayFunc(display);
    glutMainLoop();
}
--------------------------------------------------------------------------------------------------------------------------
如果要將物件移到右上角作旋轉的話則是再多一行(俗稱的T-R-T)
#include<Gl/glut.h>
void upper_arm()
{
    glPushMatrix();///備份矩陣
        glScalef(1,0.3,0.3);
        glutSolidCube(0.5);
    glPopMatrix();///還原矩陣
}
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///備份
    glTranslatef(0.5,0.5,0);///把下面正在以手軸為中心,轉動的手掛到右上角去(整體包括世界移到右上角)
    glRotatef(angle,0,0,1);///對z軸旋轉。再對正中心做轉動(開轉)
    glTranslatef(0.25,0,0);///將整個物品做移動(單獨移動物件,世界不動)
    ///世界是固定的,旋轉是以世界的中心點旋轉=>
    ///把物件的一端移動到世界的中心點->成功以一端為圓心旋轉
    upper_arm();///函式呼叫
    glPopMatrix();///還原矩陣
    angle++;///角度增加
    glutSwapBuffers();
}
int main(int argc,char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week09-1");
    glutIdleFunc(display);
    glutDisplayFunc(display);
    glutMainLoop();
}
--------------------------------------------------------------------------------------------------------------------------
如果要做成像手臂那樣子的則是這樣:
#include<Gl/glut.h>
void arm()
{
    glPushMatrix();///備份矩陣
        glScalef(1,0.3,0.3);
        glutSolidCube(0.5);
    glPopMatrix();///還原矩陣
}
float angle=0;
float dx=1;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///備份(右手1)
        glTranslatef(0.2,0,0);///把下面正在以手軸為中心,轉動的手掛到右上角去(整體包括世界移到右上角)
        glRotatef(angle,0,0,1);///對z軸旋轉。再對正中心做轉動(開轉)
        glTranslatef(0.25,0,0);///將整個物品做移動(單獨移動物件,世界不動)
        glColor3f(1,0,0);///Red
        arm();
        glPushMatrix();///備份(右手2)
            glTranslatef(0.25,0,0);///把下面正在以手軸為中心,轉動的手掛到右上角去(整體包括世界移到右上角)
            glRotatef(angle,0,0,1);///對z軸旋轉。再對正中心做轉動(開轉)
            glTranslatef(0.25,0,0);///將整個物品做移動(單獨移動物件,世界不動)
            glColor3f(1,1,0);///Yellow
            arm();
        glPopMatrix();///還原矩陣(右手2)
    glPopMatrix();///還原矩陣(右手1)

    glPushMatrix();///備份(左手1)
        glTranslatef(-0.2,0,0);///把下面正在以手軸為中心,轉動的手掛到右上角去(整體包括世界移到右上角)
        glRotatef(-angle,0,0,1);///對z軸旋轉。再對正中心做轉動(開轉)
        glTranslatef(-0.25,0,0);///將整個物品做移動(單獨移動物件,世界不動)
        glColor3f(1,0,0);///Red
        arm();
        glPushMatrix();///備份(左手2)
            glTranslatef(-0.25,0,0);///把下面正在以手軸為中心,轉動的手掛到右上角去(整體包括世界移到右上角)
            glRotatef(-angle,0,0,1);///對z軸旋轉。再對正中心做轉動(開轉)
            glTranslatef(-0.25,0,0);///將整個物品做移動(單獨移動物件,世界不動)
            glColor3f(1,1,0);///Yellow
            arm();
        glPopMatrix();///還原矩陣(左手2)
    glPopMatrix();///還原矩陣(左手1)

    angle+=dx;///角度增加
        if(angle>60) dx=-1;
        if(angle<0) dx+=1;
    glutSwapBuffers();
}
int main(int argc,char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week09-1");
    glutIdleFunc(display);
    glutDisplayFunc(display);
    glutMainLoop();
}
--------------------------------------------------------------------------------------------------------------------------

沒有留言:

張貼留言