2017年5月23日 星期二

WEEK14,跌雷嘻嘻嘻嘻..

讓機器人旋轉

在main()裡

 #include <stdio.h>
void timer(int t)
{
    glutTimerFunc(100,timer,t+1);
    angle++;
    glutPostRedisplay();
}

 glutTimerFunc(2000,timer,0);



把函式拉出去

讓程式變清爽
drawBody()
drawArm0()
drawArm1()


例子:
void drawBody()
{
    glPushMatrix( );  ///body
        glTranslatef(0,0.1,0);///T
        glRotatef(90,0,0,1);///R
        glRotatef(90,0,1,0);
        glRotatef(90,0,0,1);
        glRotatef(180,1,0,0);
        glTranslatef(0,0.5,0);///T
        glScalef(0.3,0.3,0.3);
        glmDraw(pmodel3, GLM_SMOOTH | GLM_MATERIAL);
    glPopMatrix();
}
void drawArm0()
{
    glPushMatrix( );  ///left hand arm
        glTranslatef(-0.25,0.1,0);///T
        glRotatef(45,0,0,1);///R
        glTranslatef(0,0.2,0);///T
        glScalef(0.25,0.25,0.25);
        glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
    glPopMatrix();
}
void drawArm1()
{
    glPushMatrix( );  ///left hand
        glTranslatef(-0.25,0,0);///T
        glRotatef(90,0,0,1);///R
        glTranslatef(-0.1,0.25,0);///T
        glScalef(0.25,0.25,0.25);
        glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL);
    glPopMatrix();
}
void drawRArm()
{
    glPushMatrix( );  ///Right hand arm
        glTranslatef(0.25,0.1,0);///T
        glRotatef(180,0,0,1);///R
        glRotatef(180,1,0,0);
        glRotatef(45,0,0,1);
        glTranslatef(0,0.2,0);///T
        glScalef(0.25,0.25,0.25);
        glmDraw( pmodel, GLM_SMOOTH | GLM_MATERIAL);
    glPopMatrix( );
}
void drawRhand()
{
    glPushMatrix( );  ///Right hand
        glTranslatef(0.5,0,0);///T
        glRotatef(180,0,0,1);///R
        glRotatef(180,1,0,0);
        glRotatef(90,0,0,1);
        glTranslatef(-0.1,0,0);///T
        glScalef(0.25,0.25,0.25);
        glmDraw( pmodel2, GLM_SMOOTH | GLM_MATERIAL);
    glPopMatrix( );
}
void drawHead()
{
    glPushMatrix( );  ///head
        glTranslatef(0,1,0);///T
        glTranslatef(0,-0.3,0);///T
        glScalef(0.3,0.3,0.3);
        glmDraw( pmodel4, GLM_SMOOTH | GLM_MATERIAL);
    glPopMatrix( );
}
void drawRleg()
{
    glPushMatrix( );  ///Right Leg up
        glTranslatef(-0.15,-0.3,0);///T
        //glTranslatef(0,-0.2,0);///T
        glScalef(0.3,0.5,0.3);
        glmDraw( pmodel5, GLM_SMOOTH | GLM_MATERIAL);
    glPopMatrix( );
}
void drawLleg()
{
    glPushMatrix( );  ///Left Leg up
        glTranslatef(0.15,-0.3,0);///T
        //glTranslatef(0,-0.2,0);///T
        glScalef(0.3,0.5,0.3);
        glmDraw( pmodel6, GLM_SMOOTH | GLM_MATERIAL);
    glPopMatrix( );
}
void drawRfoot()
{
    glPushMatrix( );  ///Right Leg low
        glTranslatef(-0.2,-0.65,0);///T
        glRotatef(180,0,1,0);
        //glTranslatef(0,-0.2,0);///T
        glScalef(0.5,0.75,0.5);
        glmDraw( pmodel7, GLM_SMOOTH | GLM_MATERIAL);
    glPopMatrix( );
}
void drawLfoot()
{
    glPushMatrix( );  ///Left Leg low
        glTranslatef(0.2,-0.65,0);///T
        glRotatef(180,0,1,0);
        //glTranslatef(0,-0.2,0);///T
        glScalef(0.5,0.75,0.5);
        glmDraw( pmodel8, GLM_SMOOTH | GLM_MATERIAL);
    glPopMatrix( );
}
開始旋轉製作



         glPushMatrix();
            //drawBody();
            glutSolidTeapot(0.03);
            glPushMatrix();///Left Part
                glTranslatef(-0.22, +0.35, 0);///(3) 最後,把它掛在對的位置
                glRotatef(-angle, 0,0,1); ///(1) 先轉動
                glTranslatef(0.22, -0.35, 0);///(2) move the rotate center to center
                drawArm0();

                glTranslatef(-0.48, +0.1, 0);///(3)  最後,把它掛在對的位置
                glRotatef(-angle, 0,0,1);///(1) 先轉動
                glTranslatef(0.48, -0.1, 0);///(2) 接著將旋轉中心,放到真的中心, 記得把樓上先註解掉
                drawArm1();
            glPopMatrix();

            glPushMatrix();///Right Part
                glTranslatef(+0.2, +0.36, 0);///3
                glRotatef(angle, 0,0,1); ///(1)
                glTranslatef(-0.2, -0.36, 0);///(2)
                drawRArm();

                glTranslatef(+0.48, +0.1, 0);///(3)
                glRotatef(angle, 0,0,1);///(1)
                glTranslatef(-0.48, -0.1, 0);///(2)
                drawRhand();
            glPopMatrix();


        glPopMatrix();

        drawHead();
        drawRleg();
        drawRfoot();

        drawLleg();
        drawLfoot();

    glPopMatrix( );
    glutSwapBuffers( );
}

滑鼠操作程式碼
int oldX=0, oldY=0;
void mouse(int button, int state, int x, int y)
{
    oldX=x; oldY=y;
    glutPostRedisplay();
}
void motion(int x, int y)
{
    angle += (x-oldX);
    oldX=x;
    glutPostRedisplay();
}
在int main裡面要加
glutMouseFunc(mouse);

之後在int oldX=0,oldY=0;底下加鍵盤設定
void keyboard(unsigned char key, int x, int y)
{
    if(key=='0')now=0;
    if(key=='1')now=1;
    if(key=='2')now=2;
    if(key=='3')now=3;
    if(key=='4')now=4;
}

角度處理
float angle[20] = {} ;變為函數

之後為了鍵盤設定
在int main底下加
glutKeyboardFunc(keyboard);

沒有留言:

張貼留言