2021年3月29日 星期一

你要出多少_week06

沿用上週


#include <GL/glut.h>
#include <stdio.h>
float vx[2000], vy[2000];///準備一堆頂點,等一下要畫!!介於-1~+1
int N=0;///有N個頂點
void display()
{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清空
    glBegin(GL_LINE_LOOP);
    for(int i=0;i<N;i++){
        glVertex2f( vx[i],vy[i]);
    }
    glEnd();
    glutSwapBuffers();
}
void mouse(int buttin, int state, int x, int y)
{
}
void motion (int x,int y)
{
    printf("%d %d\n",x,y);///把頂點記起來
    vx[N] = (x-150)/150.0;///很像這樣的寫法,記錄起來
    vy[N] = -(y-150)/150.0;
    N++;
    display();
}///減一半,再減一半,y加負號
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("08160520石雅慈"); //(視窗的名稱)

    glutDisplayFunc(display);//display顯示涵式
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();//準備mouse motion 移動時的涵式

}
(執行如下圖)


接著我們來設置一個長方形,利用滑鼠拖曳讓他可以旋轉
這個程式碼會多加旋轉的步驟,會改很多地方

#include <GL/glut.h>
float angle=0;
int N=0,vx[3000], vy[3000];
void display()
{


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清空
    glPushMatrix();///備份矩陣
        glRotatef(angle,0,0,1);///旋轉
        glScalef(0.5,0.1,0.1);///調成細長的
        glColor3f(0.3,0.3,1.0);///藍藍的
        glutSolidCube(1);///方塊

    glPopMatrix();///還原矩陣
    glutSwapBuffers();
}

void motion (int x,int y)
{
    angle++;
    display();///增加後,重畫畫面
}
void keyboard(unsigned char key,int x, int y)
{

}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("08160520石雅慈"); //(視窗的名稱)


    glutDisplayFunc(display);//display顯示涵式
    ///glutMouseFunc(mouse);
    glutKeyboardFunc(keyboard);
    glutMotionFunc(motion);
    glutMainLoop();//準備mouse motion 移動時的涵式


}
(執行如下圖)


接著我們來試看看讓他自己轉動
可以先把細長的長方型,暫時變回正方形
#include <GL/glut.h>
float angle=0;
void display()
{


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清空
    glPushMatrix();///備份矩陣
        glRotatef(angle++,0,0,1);///要轉動angle
        glColor3f(0.3,0.3,1.0);///藍藍的
        glutSolidCube(1);///方塊

    glPopMatrix();///還原矩陣
    glutSwapBuffers();
}

void motion (int x,int y)
{
    angle++;
    display();///增加後,重畫畫面
}
void keyboard(unsigned char key,int x, int y)
{

}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("08160520石雅慈"); //(視窗的名稱)

    glutIdleFunc(display);///idle很閒的時候,就重畫

    glutDisplayFunc(display);//display顯示涵式
    ///glutMouseFunc(mouse);
    glutMainLoop();//準備mouse motion 移動時的涵式


}
(執行如下圖)

這個步驟是來做一個手臂
#include <GL/glut.h>
float angle=0;
void display()
{


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清空
    glPushMatrix();///備份矩陣

        glColor3f(0.3,0.3,1.0);///藍藍的
        ///glTranslatef(0,0,0);///把正確轉動的手臂,掛在肩上
        ///glRotatef(angle++,0,0,1);///(2)轉動
        glTranslatef(-0.25,0,0);///(1)將旋轉中心,放在中心
        glScalef(0.5,0.1,0.1);///細細長長的
        glutSolidCube(1);///方塊
    glPopMatrix();///還原矩陣
    glutSwapBuffers();
}

void motion (int x,int y)
{
    angle++;
    display();///增加後,重畫畫面
}
void keyboard(unsigned char key,int x, int y)
{

}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("08160520石雅慈"); //(視窗的名稱)

    glutIdleFunc(display);///idle很閒的時候,就重畫

    glutDisplayFunc(display);//display顯示涵式
    ///glutMouseFunc(mouse);
    glutMainLoop();//準備mouse motion 移動時的涵式


}
(執行如下圖)

做出一隻有關節的手臂

#include <GL/glut.h>
float angle=0;
void hand()
{
    glPushMatrix();
        glScalef(0.5,0.1,0.1);///細細長長的
        glutSolidCube(1);///方塊
    glPopMatrix();
}
void display()
{


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清空
    glPushMatrix();///備份矩陣


        glTranslatef(-0.25,0,0);///把正確轉動的手臂,掛在肩上
        glRotatef(angle++,0,0,1);///(2)轉動
        glTranslatef(-0.25,0,0);///(1)將旋轉中心,放在中心
        hand();

    glPopMatrix();///還原矩陣
    hand();
    glutSwapBuffers();
}

void motion (int x,int y)
{
    angle++;
    display();///增加後,重畫畫面
}
void keyboard(unsigned char key,int x, int y)
{

}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("08160520石雅慈"); //(視窗的名稱)

    glutIdleFunc(display);///idle很閒的時候,就重畫

    glutDisplayFunc(display);//display顯示涵式
    ///glutMouseFunc(mouse);
    glutMainLoop();//準備mouse motion 移動時的涵式


}
(執行如下圖)

做出一隻可以轉動還有關節的手臂
#include <GL/glut.h>
float angle=0;
void hand()
{
    glPushMatrix();
        glScalef(0.5,0.1,0.1);///細細長長的
        glutSolidCube(1);///方塊
    glPopMatrix();
}
void display()
{


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清空
    glPushMatrix();///備份矩陣

        glTranslatef(-0.25,0,0);///把正確轉動的手臂,掛在肩上
        glRotatef(angle,0,0,1);///(2)轉動
        glTranslatef(-0.25,0,0);///(1)將旋轉中心,放在正中心
        hand();///上手臂
        glPushMatrix();
            glTranslatef(-0.25,0,0);///(3)把正確轉動的手肘,掛在肘關節
            glRotatef(angle,0,0,1);///(2)轉動
            glTranslatef(-0.25,0,0);///(1)將旋轉中心,放在正中心
            hand();
        glPopMatrix();

    glPopMatrix();///還原矩陣
    glutSwapBuffers();
    angle++;
}

void motion (int x,int y)
{
    angle++;
    display();///增加後,重畫畫面
}
void keyboard(unsigned char key,int x, int y)
{

}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("08160520石雅慈"); //(視窗的名稱)

    glutIdleFunc(display);///idle很閒的時候,就重畫

    glutDisplayFunc(display);//display顯示涵式
    ///glutMouseFunc(mouse);
    glutMainLoop();//準備mouse motion 移動時的涵式


}
(執行如下圖)

來做左右手~
#include <GL/glut.h>
float angle=0;
void hand()
{
    glPushMatrix();
        glScalef(0.5,0.1,0.1);///細細長長的
        glutSolidCube(1);///方塊
    glPopMatrix();
}
void display()
{


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清空
    glPushMatrix();///左半邊

        glTranslatef(-0.25,0,0);///(3)手臂,掛在肩上
        glRotatef(angle,0,0,1);///(2)轉動
        glTranslatef(-0.25,0,0);///(1)將旋轉中心,放在正中心
        hand();///上手臂
        glPushMatrix();
            glTranslatef(-0.25,0,0);///(3)把正確轉動的手肘,掛在肘關節
            glRotatef(angle,0,0,1);///(2)轉動
            glTranslatef(-0.25,0,0);///(1)將旋轉中心,放在正中心
            hand();///下手肘
        glPopMatrix();
    glPopMatrix();

    glPushMatrix();///右半邊

        glTranslatef(+0.25,0,0);///手臂,掛在肩上
        glRotatef(-angle,0,0,1);///(2)轉動
        glTranslatef(+0.25,0,0);///(1)將旋轉中心,放在正中心
        hand();///上手臂
        glPushMatrix();
            glTranslatef(+0.25,0,0);(3)把正確轉動的手肘,掛在肘關節
            glRotatef(-angle,0,0,1);(2)轉動
            glTranslatef(+0.25,0,0);(1)將旋轉中心,放在正中心
            hand();///下手肘
        glPopMatrix();
    glPopMatrix();///還原矩陣

    glutSwapBuffers();
    angle++;
}

void motion (int x,int y)
{
    angle++;
    display();///增加後,重畫畫面
}
void keyboard(unsigned char key,int x, int y)
{

}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("08160520石雅慈"); //(視窗的名稱)

    glutIdleFunc(display);///idle很閒的時候,就重畫

    glutDisplayFunc(display);//display顯示涵式
    ///glutMouseFunc(mouse);
    glutMainLoop();//準備mouse motion 移動時的涵式


}
(執行如下圖)


沒有留言:

張貼留言

Week18期末作業(橘貓的跳舞熊熊)

 期末作業(橘貓的跳舞熊熊) 影片: https://youtu.be/R89tptMaQZw 程式碼: #include <opencv/highgui.h> #include <opencv/cv.h> #include <GL/glut.h...