2019年5月3日 星期五

Tokoyami_world.exe_week11

TRT轉動

今天的目標是要用上次所學的「TRT轉動」來達成關節活動的目標,首先要先下載......(以下略

接著就可以開始啦~

先做出一個方塊當身體......



接著將一個紅色方塊加入到「身體」右側作為右手臂第一部分......



接著再將一個紅色方塊加入到「右手臂第一部分」右側作為右手臂第二部分......



但是這就出現了另一個問題:手不可能這樣轉,所以我們必須讓它能夠自己控制......



成功了!接著就是做出另外一只手了

因為有左右兩邊的旋轉角度剛好相反,所以只需要將angle變數改成負的就好啦~



不過還是有個問題,現在雖然可以用滑鼠控制轉動了,每次點滑鼠時,角度又會跳掉,要想想辦法才行......

將滑鼠放開後的角度減去滑鼠按下的瞬間的角度,這樣就可以保留住角度變化了



但我希望每個關節都能自由轉動,該怎麼辦?

如果我用鍵盤輔助如何?

將鍵盤的數字鍵與各個旋轉角度做連結,就可以透過按下不同數字鍵轉動不同關節了~



完成啦~~(灑花

以下是這次的程式碼:

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

        glColor3f(1,0,0);///紅色的
        glutSolidCube( 0.3 );///右手臂

        glPushMatrix();///NOW2
            glTranslatef(0.25, 0, 0);///(3) 掛在身體的右肘///NOW2
            glRotatef(angle2, 0,0,1);///(2) 旋轉///NOW2
            glTranslatef(0.14, 0,0);///(1) 把方塊,移動到畫面的中心,當旋轉軸///NOW2

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

    glPopMatrix();

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

        glColor3f(1,0,0);///紅色的
        glutSolidCube( 0.3 );///左手臂

        glPushMatrix();///NOW2
            glTranslatef(-0.25, 0, 0);///(3) 掛在身體的左肘///NOW2
            glRotatef(-angle4, 0,0,1);///(2) 旋轉///NOW2
            glTranslatef(-0.14, 0,0);///(1) 把方塊,移動到畫面的中心,當旋轉軸///NOW2

            glColor3f(1,0,0);///紅色的///NOW2
            glutSolidCube( 0.25 );///左下手臂///NOW2
        glPopMatrix();///NOW2

    glPopMatrix();

    glutSwapBuffers();
    ///angle++;///NOW
}
int oldX ,oldY;
void motion(int x ,int y)
{
    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;
    display();
}
void mouse(int button ,int state ,int x ,int y)
{
    oldX = x ;oldY = y;
}
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);
    glutMouseFunc(mouse);
    glutKeyboardFunc(keyboard);///NOW6 配合鍵盤
    glutMainLoop();
}

沒有留言:

張貼留言