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();
}

矩陣要從後面乘到前面,先做的事要往下放
(概念圖)
沒有留言:
張貼留言