2015年5月28日 星期四

02160074_張凱晴 week14

本週重點:T-R-T對關節轉


人物往右下移動,中心是人物本身,因此旋轉時是自轉


中心在視窗正中間,人物像公轉一樣,繞著中心轉

先畫一個茶壺並打光
 茶壺以視窗中間點為中心公轉


T:右邊茶壺掛到中間茶壺(旋轉中心)
R:旋轉
T:右邊的茶壺依照中心點旋轉
Teap():右邊的茶壺
Teap():中間的茶壺

程式碼:
#include <GL/glut.h>
float angle=0, oldX=0, oldY=0;
void drawArm()
{
    glPushMatrix();
        glScalef(0.5, 0.15, 0.15);
        glutSolidCube(1);
    glPopMatrix();
}
void drawBody()
{
    glPushMatrix();
        glTranslatef(0, -0.5, 0);///將身體往下移0.5
        glRotatef(-90, 1, 0, 0);
        glutSolidCone(0.3, 0.8, 30, 30);
    glPopMatrix();
}
void display()
{
    {///打光的程式6行
    GLfloat pos[]= {0.0, 0.0, -1.0, 0.0};
    glLightfv(GL_LIGHT0, GL_POSITION, pos);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    }
    glPushMatrix();
        glTranslatef(0.15, 0, 0);
        glRotatef(angle, 0, 0, 1);
        glTranslatef(0.25, 0, 0);
        drawArm();///右手1
        glPushMatrix();
            glTranslatef(0.25, 0, 0);
            glRotatef(angle, 0, 0, 1);
            glTranslatef(0.25, 0, 0);
            drawArm();///右手2
        glPopMatrix();
    glPopMatrix();

    glPushMatrix();
        glTranslatef(-0.15, 0, 0);
        glRotatef(-angle, 0, 0, 1);
        glTranslatef(-0.25, 0, 0);
        drawArm();///左手1
        glPushMatrix();
            glTranslatef(-0.25, 0, 0);
            glRotatef(-angle, 0, 0, 1);
            glTranslatef(-0.25, 0, 0);
            drawArm();///左手2
        glPopMatrix();
    glPopMatrix();
    drawBody();
    glFlush();
}
void timer (int t)
{
    glutTimerFunc(20, timer, 0);
    //angle++;
    glutPostRedisplay();
}
void mouse(int button, int state, int x, int y)///滑鼠
{
    if(state==GLUT_DOWN)
    {
        oldX=x; oldY=y;
    }
}
void motion(int x, int y)///移動
{
    angle+= ( x-oldX );
    oldX= x;
}
int main(int argc, char**argv)///主程式
{
    glutInit(&argc, argv);
    glutCreateWindow("TRT 3D");
    glutDisplayFunc(display);

    glutTimerFunc(20, timer, 0);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}

沒有留言:

張貼留言