2020年4月21日 星期二

Week08-glu/glut函式 & T-R-T

W08-1---glu/glut函式


實心的圓形,錐形,環狀圓形

W08-2---關節T-R-T(移動, 旋轉, 移動)機器人手臂

順序 : 畫手臂-移動-旋轉-移動


做一個長方體在中間,讓它可以旋轉







讓長方體往右移動0.25
以手肘關節當中心點(0,0)大幅度旋轉

把全部都搬移到右上方(0.5, 0.5, 0)的座標位置

右手 : 複製上手臂到下面當下手臂
(注意 : 最外圍要有備份矩陣跟還原矩陣包起來)
紅色當上手臂,黃色當下手臂

左手 : 複製右手到下面當左手
(注意 : 左右要對稱,(T,R,T)要加負號)

限制手擺動幅度,正常人的手不能繞一整圈~~
~~程式碼~~
#include <Gl/glut.h>
void arm()
{
    glPushMatrix();
        glScalef(1,0.3,0.3);
        glutSolidCube(0.5);
    glPopMatrix();
}
float angle=0;
int dx=1;
void display()

{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();///右邊
            glTranslatef(0.2,0,0);///把下面正在轉動的手臂移到右上角
            glRotatef(angle, 0, 0, 1);///對Z軸轉動,像時針一樣轉動
            glTranslatef(0.25,0,0);///把關節(旋轉中心)放到畫面正中心
            glColor3f(1,0,0);///畫紅色的手
            arm();///上手臂

        glPushMatrix();
            glTranslatef(0.25,0,0);///把下面正在轉動的手臂移到右上角
            glRotatef(angle, 0, 0, 1);///對Z軸轉動,像時針一樣轉動
            glTranslatef(0.25,0,0);///把關節(旋轉中心)放到畫面正中心
            glColor3f(1,1,0);///畫黃色的手
            arm();///下手臂
        glPopMatrix();
   glPopMatrix();

   glPushMatrix();///左邊
            glTranslatef(-0.2,0,0);///把下面正在轉動的手臂移到右上角
            glRotatef(-angle, 0, 0, 1);///對Z軸轉動,像時針一樣轉動
            glTranslatef(-0.25,0,0);///把關節(旋轉中心)放到畫面正中心
            glColor3f(1,0,0);///畫紅色的手
            arm();///上手臂

        glPushMatrix();
            glTranslatef(-0.25,0,0);///把下面正在轉動的手臂移到右上角
            glRotatef(-angle, 0, 0, 1);///對Z軸轉動,像時針一樣轉動
            glTranslatef(-0.25,0,0);///把關節(旋轉中心)放到畫面正中心
            glColor3f(1,1,0);///畫黃色的手
            arm();///下手臂
        glPopMatrix();
   glPopMatrix();

    if(angle>60) dx=-1;
    if(angle<0)  dx=+1;
    angle+=0.03*(dx);
    glutSwapBuffers();
}

int main(int argc, char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("W08");
    glutIdleFunc(display);
    glutDisplayFunc(display);
    glutMainLoop();
}

W08-3---利用T-R-T做出小小兵機器人


~~程式碼~~
#include <Gl/glut.h>
#include <stdio.h>
#include <math.h> ///為了 cos() sin()
void arm()
{
    glPushMatrix();
        glScalef(1,0.3,0.3);
        glutSolidCube(0.5);
    glPopMatrix();
}
float angle=0;
int dx=1;


float teapotX=0, teapotY=0; ///這裡是-1.0 ~ +1.0的座標
void display()
{

    glClearColor(228/255.0, 142/255.0, 190/255.0, 1);///粉色背景
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清背景

    glBegin(GL_POLYGON); ///開始畫小小兵方的臉
        glColor3f((233/255.0),(212/255.0) , (90/255.0));
        for(float angle=0;angle<=2*3.1415;angle+=0.01){
            glVertex2f( 0.13*cos(angle)+0.3, 0.13*sin(angle)+0.26 );
            glVertex2f( 0.13*cos(angle)-0.3, 0.13*sin(angle)+0.26 );
            glVertex2f( 0.13*cos(angle)-0.3, 0.13*sin(angle)-0.6 );
            glVertex2f( 0.13*cos(angle)+0.3, 0.13*sin(angle)-0.6 );
        }
        //glVertex2f((-150)/150.2,-(-150)/150.0);///畫圖 : 設定數值
        glEnd(); ///結束畫
     glBegin(GL_POLYGON); ///開始畫小小兵方的衣服
        glColor3f((20/255.0),(113/255.0) , (244/255.0));
        for(float angle=0;angle<=2*3.1415;angle+=0.01){
            glVertex2f( 0.13*cos(angle)+0.3, 0.13*sin(angle)-0.6 );
            glVertex2f( 0.13*cos(angle)-0.3, 0.13*sin(angle)-0.6 );
            glVertex2f( 0.13*cos(angle)-0.3, 0.13*sin(angle)-0.4 );
            glVertex2f( 0.13*cos(angle)+0.3, 0.13*sin(angle)-0.4);
        }
        //glVertex2f((-150)/150.2,-(-150)/150.0);///畫圖 : 設定數值
        glEnd(); ///結束畫


        glBegin(GL_POLYGON); ///開始畫右眼灰
        glColor3f((131/255.0),(134/255.0) , (132/255.0));
        for(float angle=0;angle<=2*3.1415;angle+=0.01){
            glVertex2f( 0.18*cos(angle)+0.155, 0.18*sin(angle)+0.1 );
        }
        glEnd(); ///結束畫


        glBegin(GL_POLYGON); ///開始畫右眼白
        glColor3f((252/255.0),(252/255.0) , (242/255.0));
        for(float angle=0;angle<=2*3.1415;angle+=0.01){
            glVertex2f( 0.125*cos(angle)+0.155, 0.125*sin(angle)+0.1 );
        }
        glEnd(); ///結束畫

        glBegin(GL_POLYGON); ///開始畫右眼球
        glColor3f((138/255.0),(51/255.0) , (3/255.0));
        for(float angle=0;angle<=2*3.1415;angle+=0.01){
            glVertex2f( 0.06*cos(angle)+0.12, 0.06*sin(angle)+0.08 );
        }
        glEnd(); ///結束畫

        glBegin(GL_POLYGON); ///開始畫右眼黑
        glColor3f((0/255.0),(0/255.0) , (0/255.0));
        for(float angle=0;angle<=2*3.1415;angle+=0.01){
            glVertex2f( 0.04*cos(angle)+0.12, 0.04*sin(angle)+0.09 );
        }
        glEnd(); ///結束畫


        glBegin(GL_POLYGON); ///開始畫右眼朱
        glColor3f((252/255.0),(252/255.0) , (242/255.0));
        for(float angle=0;angle<=2*3.1415;angle+=0.01){
            glVertex2f( 0.015*cos(angle)+0.12, 0.015*sin(angle)+0.09 );
        }
        glEnd(); ///結束畫



        glBegin(GL_POLYGON); ///開始畫左眼灰
        glColor3f((131/255.0),(134/255.0) , (132/255.0));
        for(float angle=0;angle<=2*3.1415;angle+=0.01){
            glVertex2f( 0.18*cos(angle)-0.155, 0.18*sin(angle)+0.1 );
        }
        glEnd(); ///結束畫


        glBegin(GL_POLYGON); ///開始畫左眼白
        glColor3f((252/255.0),(252/255.0) , (242/255.0));
        for(float angle=0;angle<=2*3.1415;angle+=0.01){
            glVertex2f( 0.125*cos(angle)-0.155, 0.125*sin(angle)+0.1 );
        }
        glEnd(); ///結束畫

        glBegin(GL_POLYGON); ///開始畫左眼球
        glColor3f((50/255.0),(145/255.0) , (15/255.0));
        for(float angle=0;angle<=2*3.1415;angle+=0.01){
            glVertex2f( 0.06*cos(angle)-0.12, 0.06*sin(angle)+0.08 );
        }
        glEnd(); ///結束畫

        glBegin(GL_POLYGON); ///開始畫左眼黑
        glColor3f((0/255.0),(0/255.0) , (0/255.0));
        for(float angle=0;angle<=2*3.1415;angle+=0.01){
            glVertex2f( 0.04*cos(angle)-0.12, 0.04*sin(angle)+0.09 );
        }
        glEnd(); ///結束畫


        glBegin(GL_POLYGON); ///開始畫左眼朱
        glColor3f((252/255.0),(252/255.0) , (242/255.0));
        for(float angle=0;angle<=2*3.1415;angle+=0.01){
            glVertex2f( 0.015*cos(angle)-0.12, 0.015*sin(angle)+0.09 );
        }
        glEnd(); ///結束畫

        glBegin(GL_POLYGON); ///開始畫嘴巴
        glColor3f((244/255.0),(20/255.0) , (20/255.0));
        for(float angle=0;angle<=2*3.1415;angle+=0.01){
            glVertex2f( 0.04*cos(angle)-0.06, 0.04*sin(angle)-0.18 );
            glVertex2f( 0.04*cos(angle)-0, 0.04*sin(angle)-0.23 );
            glVertex2f( 0.04*cos(angle)+0.06, 0.04*sin(angle)-0.18 );
            glVertex2f( 0.04*cos(angle)+0, 0.04*sin(angle)-0.23 );
        }
        glEnd(); ///結束畫


    glPushMatrix();///右邊
            glTranslatef(0.38,-0.4,0);///把下面正在轉動的手臂移到右上角
            glRotatef(angle, 0, 0, 1);///對Z軸轉動,像時針一樣轉動
            glTranslatef(0.25,0,0);///把關節(旋轉中心)放到畫面正中心
            glColor3f((233/255.0),(212/255.0) , (90/255.0));
            arm();///上手臂
        glPushMatrix();
            glTranslatef(0.25,0,0);///把下面正在轉動的手臂移到右上角
            glRotatef(angle, 0, 0, 1);///對Z軸轉動,像時針一樣轉動
            glTranslatef(0.25,0,0);///把關節(旋轉中心)放到畫面正中心
            glColor3f((233/255.0),(212/255.0) , (90/255.0));
            arm();///下手臂
        glPopMatrix();
   glPopMatrix();
   glPushMatrix();///左邊
            glTranslatef(-0.38,-0.4,0);///把下面正在轉動的手臂移到右上角
            glRotatef(-angle, 0, 0, 1);///對Z軸轉動,像時針一樣轉動
            glTranslatef(-0.25,0,0);///把關節(旋轉中心)放到畫面正中心
           glColor3f((233/255.0),(212/255.0) , (90/255.0));
            arm();///上手臂
        glPushMatrix();
            glTranslatef(-0.25,0,0);///把下面正在轉動的手臂移到右上角
            glRotatef(-angle, 0, 0, 1);///對Z軸轉動,像時針一樣轉動
            glTranslatef(-0.25,0,0);///把關節(旋轉中心)放到畫面正中心
            glColor3f((233/255.0),(212/255.0) , (90/255.0));
            arm();///下手臂
        glPopMatrix();
   glPopMatrix();
    if(angle>60) dx=-1;
    if(angle<0)  dx=+1;
    angle+=0.03*(dx);
    glutSwapBuffers();
}

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

    glutMainLoop();

}

沒有留言:

張貼留言