2015年5月27日 星期三

Week14 02160943 何永育 (課堂)

利用範例了解旋轉觀念

以鈕扣為中心旋轉
移動後人物一樣以鈕扣中心旋轉
 按右鍵選擇Swap後,選轉軸以螢幕中心旋轉




開啟CodeBlocks   GLUT專案

#include <GL/glut.h>

void display()
{
    GLfloat pos[]={0, 0, -1, 0};
    glLightfv(GL_LIGHT0, GL_POSITION, pos);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);

    glEnable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glutSolidTeapot(0.3);

    glFlush();
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("T-R-T test");
    glutDisplayFunc(display);

    glutMainLoop();
}




關節觀念
設定 關節設定(先將茶壺建出,再將茶壺移動至適當位置成茶壺中心點,再設定旋轉,最後將茶壺關節部分移動到其位置)

#include <GL/glut.h>
float angle=0;
void display()
{
    GLfloat pos[]={0, 0, -1, 0};
    glLightfv(GL_LIGHT0, GL_POSITION, pos);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    glEnable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();
        glTranslatef(0.6, 0.2, 0);///ver4
        glRotatef(angle, 0,0,1);///ver3
        glTranslatef(0.3, 0, 0);///ver2
        glutSolidTeapot(0.3);///ver1
    glPopMatrix();
    glutSolidTeapot(0.3);

    glFlush();
}

void timer(int t)
{
    glutTimerFunc(20, timer, t+1);
    angle++;
    glutPostRedisplay();
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("T-R-T test");
    glutDisplayFunc(display);
    glutTimerFunc(20, timer, 0);
    glutMainLoop();
}




做出手臂(關節)     TRT(Translate,Rotate,Translate)
#include <GL/glut.h>
float angle=0;
void drawBody()
{
    glPushMatrix();
    glScalef(1,0.5,0.5);
    glutSolidCube(1);
    glPopMatrix();
}
void drawArm()
{
    glPushMatrix();
    glScalef(0.6,0.3,0.3);
    glutSolidCube(1);
    glPopMatrix();
}
void display()
{
    GLfloat pos[]={0, 0, -1, 0};
    glLightfv(GL_LIGHT0, GL_POSITION, pos);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    glEnable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();
        glTranslatef(0.5, 0, 0);///ver4
        glRotatef(angle, 0,0,1);///ver3
        glTranslatef(0.3, 0, 0);///ver2
        drawArm();///ver1
    glPopMatrix();
    drawBody();

    glFlush();
}

void timer(int t)
{
    glutTimerFunc(20, timer, t+1);
    angle++;
    glutPostRedisplay();
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("T-R-T test");
    glutDisplayFunc(display);
    glutTimerFunc(20, timer, 0);
    glutMainLoop();
}



利用滑鼠控制手臂
做出兩個手臂
#include <GL/glut.h>
float angle=0, oldX=0, oldY=0;
void drawBody()
{
    glPushMatrix();
    glScalef(1,0.5,0.5);
    glutSolidCube(1);
    glPopMatrix();
}
void drawArm()
{
    glPushMatrix();
    glScalef(0.6,0.3,0.3);
    glutSolidCube(1);
    glPopMatrix();
}
void display()
{
    GLfloat pos[]={0, 0, -1, 0};
    glLightfv(GL_LIGHT0, GL_POSITION, pos);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    glEnable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();///right hand
        glTranslatef(0.5, 0, 0);///ver4
        glRotatef(angle, 0,0,1);///ver3
        glTranslatef(0.25, 0, 0);///ver2
        drawArm();///ver1
        glPushMatrix();
            glTranslatef(0.25, 0, 0);///ver4
            glRotatef(angle, 0,0,1);///ver3
            glTranslatef(0.25, 0, 0);///ver2
            drawArm();///ver1
        glPopMatrix();
    glPopMatrix();
    
    glPushMatrix();///left hand
        glTranslatef(-0.5, 0, 0);///ver4
        glRotatef(-angle, 0,0,1);///ver3
        glTranslatef(-0.25, 0, 0);///ver2
        drawArm();///ver1
        glPushMatrix();
            glTranslatef(-0.25, 0, 0);///ver4
            glRotatef(-angle, 0,0,1);///ver3
            glTranslatef(-0.25, 0, 0);///ver2
            drawArm();///ver1
        glPopMatrix();
    glPopMatrix();
    drawBody();

    glFlush();
}

void motion(int x,int y)
{
    angle -=y - oldY;
    oldY=y;
    oldX=x;
}

void mouse(int button, int state, int x, int y)
{
    if(state==GLUT_DOWN)
    {
        oldX=x;
        oldY=y;
    }
}

void timer(int t)
{
    glutTimerFunc(20, timer, t+1);
    //angle++;
    glutPostRedisplay();
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("T-R-T test");
    glutDisplayFunc(display);
    glutTimerFunc(20, timer, 0);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}



沒有留言:

張貼留言