2020年4月21日 星期二

wk8



今天知道了GLUT的基本形狀
glutSolidSphere(1,slices,stacks);///實心圓形
 glutSolidCone(1,1,slices,stacks);///實心甜筒
glutSolidTorus(0.2,0.8,slices,stacks);///實心甜甜圈
glutWireSphere(1,slices,stacks);///空心的圓形

---------------------------------------------------------------------------------------------

機器人手臂


先用cube做出上手臂,然後讓他轉動

#include <GL/glut.h>
void upperarm(){
    glPushMatrix();///備份
        glScalef(1,0.3,0.3);///x不變,y,z都變0.3
        glutSolidCube(0.5);
    glPopMatrix();///還原
}
float angle=0;
void display(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();
        glRotatef(angle,0,0,1);///對z軸旋轉
        upperarm();///呼叫函式
    glPopMatrix();
    angle++;

    glutSwapBuffers();
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("wk9");
    glutIdleFunc(display);

    glutDisplayFunc(display);

    glutMainLoop();
}


上一個程式是以中心點做旋轉。
為了要讓手臂可以在對的點來旋轉,
在Rotate後面加入glTranslatef(0.25,0,0);,
讓他可以正確地轉動

float angle=0;
void display(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();
        glRotatef(angle,0,0,1);
        glTranslatef(0.25,0,0);
        upperarm();
    glPopMatrix();
    angle++;

    glutSwapBuffers();
}




移動手臂到右上角

float angle=0;
void display(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();
        glTranslatef(0.45,0.45,0);///把手臂掛到到右上角
        glRotatef(angle,0,0,1):
        glTranslatef(0.3,0,0);
        upperarm();
    glPopMatrix();
    angle++;

    glutSwapBuffers();
}




做出完整的手臂並做出兩隻手
前臂跟著上臂旋轉,並自己再旋轉

float angle=0;
void display(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();///Right upper arm
        glTranslatef(0.2,0,0);
        glRotatef(angle,0,0,1);
        glTranslatef(0.25,0,0);
        glColor3f(1,0,0);
        arm();

        glPushMatrix();///Right lower arm
            glTranslatef(0.2,0,0);
            glRotatef(angle,0,0,1);
            glTranslatef(0.25,0,0);
            glColor3f(1,1,0);
            arm();
        glPopMatrix();

    glPopMatrix();

        glPushMatrix();///Left upper arm
        glTranslatef(-0.2,0,0);
        glRotatef(-angle,0,0,1);
        glTranslatef(-0.25,0,0);
        glColor3f(1,0,0);
        arm();

        glPushMatrix();///Left lower arm
            glTranslatef(-0.2,0,0);
            glRotatef(-angle,0,0,1);
            glTranslatef(-0.25,0,0);
            glColor3f(1,1,0);
            arm();
        glPopMatrix();

    glPopMatrix();
    angle++;

    glutSwapBuffers();
}



讓手臂可以以正常的方式來動


float angle=0,dx=1;
void display(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();///Right upper arm
        glTranslatef(0.2,0,0);
        glRotatef(angle,0,0,1);
        glTranslatef(0.25,0,0);
        glColor3f(1,0,0);
        arm();

        glPushMatrix();///Right lower arm
            glTranslatef(0.2,0,0);
            glRotatef(angle,0,0,1);
            glTranslatef(0.25,0,0);
            glColor3f(1,1,0);
            arm();
        glPopMatrix();

    glPopMatrix();

        glPushMatrix();///Left upper arm
        glTranslatef(-0.2,0,0);
        glRotatef(-angle,0,0,1);
        glTranslatef(-0.25,0,0);
        glColor3f(1,0,0);
        arm();

        glPushMatrix();///Left lower arm
            glTranslatef(-0.2,0,0);
            glRotatef(-angle,0,0,1);
            glTranslatef(-0.25,0,0);
            glColor3f(1,1,0);
            arm();
        glPopMatrix();

    glPopMatrix();
    angle+=dx;
    if(angle>60) dx=-1;
    if(angle<0) dx=+1;

    glutSwapBuffers();
}

沒有留言:

張貼留言