2020年4月22日 星期三

2020/04/22-天氣雨

Week09
1. 期中考: OpenGL必背10函式 (老師有模擬考系統 http://120.96.99.55 )
模擬考練習:
1.  glPushMatrix();//備份矩陣
2.  glTranslatef(x,y,z);//移動
3.  glRotatef(angle,x,y,z);//旋轉
4.  glScalef(x,y,z);//縮放
5.  glBegin(GL_POLYGON);//開始畫
6.    glColor3f(x,y,z);//顏色
7.    glTexCoord2f(tx,ty);//貼圖座標
8.    glNormal3f(nx,ny,nz);//法向量
9.    glVertex2f(x,y);//頂點
10. glEnd();//結束畫
11. glPopMatrix();//還原矩陣

Moodle上正式開考:


2. 主題: glu/glut函式


3. 階層式移動、階層式轉動

用之前教的函式寫一個實心方塊(glutSolidCube)


用自己的函式(void myCube)簡化,並寫出第二個方塊

#include <GL/glut.h>
void myCube()///TODO2:用自己的函式,簡化程式碼
{
    glPushMatrix();///備份矩陣
        glScalef(0.5,0.2,0.2);///設定大小
        glutSolidCube(1);///TODO:正方塊
    glPopMatrix();///還原矩陣
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///TODO3:再保護一次
        glColor3f(1,0,0);
        myCube();///Cube1

        glTranslatef(0.4,0.1,0);
        glColor3f(1,1,0);///黃色
        myCube();///Cube2
    glPopMatrix();
    glutSwapBuffers();
}
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week09");

    glutDisplayFunc(display);
    glutMainLoop();

}


使紅色方塊旋轉

#include <GL/glut.h>
void myCube()
{
    glPushMatrix();
        glColor3f(1,0,0);
        glScalef(0.5,0.2,0.2);
        glutSolidCube(1);
    glPopMatrix();
}
float angle=0;///設定轉動變數(角度)
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(angle,0,0,1);///轉動
        myCube();
    glPopMatrix();
    angle++;///每次角度增加
    glutSwapBuffers();
}
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week09");
    glutIdleFunc(display);///有空idle時,重畫畫面
    glutDisplayFunc(display);
    glutMainLoop();

}


改變旋轉軸,將要當軸心的部分放在畫面中間即可

#include <GL/glut.h>
void myCube()///TODO2:用自己的函式,簡化程式碼
{
    glPushMatrix();
        glColor3f(1,0,0);
        glScalef(0.5,0.2,0.2);
        glutSolidCube(1);
    glPopMatrix();
}
float angle=0;///設定轉動變數(角度)
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(angle,0,0,1);///轉動
        glTranslatef(0.22,0,0);///把要轉動的部分放到畫面中心
        myCube();
    glPopMatrix();
    angle++;///每次角度增加
    glutSwapBuffers();
}
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week09");
    glutIdleFunc(display);///有空idle時,重畫畫面
    glutDisplayFunc(display);
    glutMainLoop();

}



新增一個綠色方塊當機器人的身體把下面(旋轉中)的手臂掛到右上角
#include <GL/glut.h>
void myCube()
{
    glPushMatrix();
        glColor3f(1,0,0);
        glScalef(0.5,0.2,0.2);
        glutSolidCube(1);
    glPopMatrix();
}
float angle=0;///設定轉動變數(角度)
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glColor3f(0,1,0);///綠色
    glutSolidCube(0.6);///畫第二個方塊當身體
    glPushMatrix();
        glTranslatef(0.3,0.3,0);///把下面(旋轉中)的手臂掛到右上角
        glRotatef(angle,0,0,1);///轉動
        glTranslatef(0.22,0,0);///把要轉動的中心點放到畫面中心
        myCube();
    glPopMatrix();
    angle++;///每次角度增加
    glutSwapBuffers();
}
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week09");
    glutIdleFunc(display);///有空idle時,重畫畫面
    glutDisplayFunc(display);
    glutMainLoop();

}



矩陣要從後面乘到前面,先做的事要往下放
(概念圖)

沒有留言:

張貼留言