2020年4月21日 星期二

Week08 機器人手臂

畫一個長方形並旋轉
#include <GL/glut.h>
void upper_arm(){
    glPushMatrix();///備份
        glScalef(1,0.3,0.3);///scale放大縮小,x不變,y、z變1/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旋轉
        upper_arm();///呼叫函式
    glPopMatrix();///還原
    angle++;///增加角度
    glutSwapBuffers();
}
int main(int a,char**b){
    glutInit(&a,b);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("Week08");
    glutIdleFunc(display);///有空就呼叫一下display,等同自動旋轉
    glutDisplayFunc(display);
    glutMainLoop();
}

稍微修改一下
 在display函式內加入:
glTranslatef(0.25,0,0);///把長方形(旋轉中心)移到畫面正中心
在display函式內加入:
glTranslatef(0.5,0.5,0);///把長方形移到畫面右上角
添加完成的樣子




機器人手臂
#include <GL/glut.h>
void arm(){
    glPushMatrix();
        glScalef(1,0.3,0.3);
        glutSolidCube(0.5);
    glPopMatrix();
}
float angle=0;
void display(){
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///右手,備份
        glTranslatef(0.2,0,0);///上手臂移至畫面右上
        glRotatef(angle,0,0,1);///手臂轉動
        glTranslatef(0.25,0,0);///上手臂(旋轉中心)移至畫面中心
        glColor3f(1,0,0);///上顏色RGB
        arm();///呼叫畫手臂函式
        glPushMatrix();///備份
            glTranslatef(0.25,0,0);///下手臂移至畫面右中
            glRotatef(angle,0,0,1);///手臂轉動
            glTranslatef(0.25,0,0);///下手臂(旋轉中心)移至畫面中心
            glColor3f(0,0,1);///上顏色RGB
            arm();///呼叫畫手臂函式
        glPopMatrix();///還原
    glPopMatrix();///還原
    
    glPushMatrix();///左手,備份 
        glTranslatef(-0.2,0,0);///上手臂移至畫面左上
        glRotatef(-angle,0,0,1);///手臂轉動
        glTranslatef(-0.25,0,0);///上手臂(旋轉中心)移至畫面中心
        glColor3f(1,0,0);///上顏色RGB
        arm();///呼叫畫手臂函式
        glPushMatrix();
            glTranslatef(-0.25,0,0);///下手臂移至畫面左中
            glRotatef(-angle,0,0,1);///手臂轉動
            glTranslatef(-0.25,0,0);///上手臂(旋轉中心)移至畫面中心
            glColor3f(0,0,1);///上顏色RGB
            arm();///呼叫畫手臂函式
        glPopMatrix();///還原
    glPopMatrix();///還原
    
    angle+=dx;
    if(snagle>60)dx=-1;
    if(angle<0)dx=+1;
    glutSwapBuffers();
}
int main(int a,char**b){
    glutInit(&a,b);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("Week08");
    glutIdleFunc(display);
    glutDisplayFunc(display);
    glutMainLoop();
}
畫手臂的程式碼詳細解釋




沒有留言:

張貼留言