2019年5月3日 星期五

學渣的奮鬥史-9

今天上課的內容是利用階乘性的TRT移動以及旋轉去做骨架的模擬



今天不需要寫太多的程式所以老師有給我們程式碼

下載地址在[http://120.125.89.81/]

修改老師的程式碼

讓原本只有一隻手的範例改成兩隻手


程式碼如下

#include <GL/glut.h>
float angle=0;///NOW
float angle1=0, angle2=0, angle3=0, angle4=0;///NOW ///NOW6 配合鍵盤
int jointID=1;///NOW6 配合鍵盤
void display( )
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(255,255,255); ///白色的
    glutSolidTeapot( 0.3 ); ///身體
    glPushMatrix( ); ///右邊手臂
        glTranslatef(0.3, 0, 0); ///(3) 掛在身體的右肩
        glRotatef(angle, 0,0,1); ///(2) 旋轉
        glTranslatef(0.15, 0,0); ///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸

        glColor3f(1,0,0); ///紅色的
        glutSolidTeapot( 0.15 ); ///右手臂

        glPushMatrix( ); ///NOW2
            glTranslatef(0.2, 0, 0); ///(3) 掛在身體的右肘///NOW2
            glRotatef(angle, 0,0,1); ///(2) 旋轉///NOW2
            glTranslatef(0.15, 0,0); ///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2

            glColor3f(1,0,0); ///紅色的 ///NOW2
            glutSolidTeapot( 0.15 ); ///右下手臂///NOW2
        glPopMatrix( ); ///NOW2
    glPopMatrix( );

    glPushMatrix( ); ///左邊手臂
        glTranslatef(-0.3, 0, 0); ///(3) 掛在身體的左肩
        glRotatef(angle, 0,0,-1); ///(2) 旋轉
        glTranslatef(-0.15, 0,0); ///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸

        glColor3f(1,0,0); ///紅色的
        glutSolidTeapot( 0.15 ); ///左手臂

        glPushMatrix(); ///NOW2
            glTranslatef(-0.2, 0, 0); ///(3) 掛在身體的左肘///NOW2
            glRotatef(angle, 0,0,-1); ///(2) 旋轉///NOW2
            glTranslatef(-0.15, 0,0); ///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2

            glColor3f(1,0,0); ///紅色的///NOW2
            glutSolidTeapot( 0.15 ); ///左下手臂///NOW2
        glPopMatrix( ); ///NOW2
    glPopMatrix( );
    glutSwapBuffers( );
     ///angle++; ///NOW
}
int oldX, oldY;///NOW5
void motion(int x, int y)///NOW3 用滑鼠mouse來控制angle
{
    if(jointID==1) angle1 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
    if(jointID==2) angle2 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
    if(jointID==3) angle3 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
    if(jointID==4) angle4 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
    oldX=x;///NOW5
    display();///NOW3 用滑鼠mouse來控制angle
}
void mouse(int button, int state, int x, int y)///NOW5 要知道mouse的按鍵狀況
{///NOW5 要知道mouse的按鍵狀況
    oldX = x; oldY = y;///NOW5 要知道mouse的按鍵狀況, 按下去時,就記得 oldX
}
void keyboard(unsigned char key, int x, int y)///NOW6 配合鍵盤
{
    if(key=='1') jointID=1;///NOW6 配合鍵盤
    if(key=='2') jointID=2;///NOW6 配合鍵盤
    if(key=='3') jointID=3;///NOW6 配合鍵盤
    if(key=='4') jointID=4;///NOW6 配合鍵盤
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("week11 TRT");

    glutIdleFunc(display);///NOW
    glutDisplayFunc(display);
    glutMotionFunc(motion);///NOW3 用滑鼠mouse來控制angle
    glutMouseFunc(mouse);///NOW5 要知道mouse的按鍵狀況
    glutKeyboardFunc(keyboard);///NOW6 配合鍵盤

    glutMainLoop( );
}









沒有留言:

張貼留言