Step0:期中考
glPushMatrix();//備份矩陣
glTranslatef(x,y,z);//移動
glRotatef(angle,x,y,z);//轉動
glScalef(x,y,z);//縮放
glTranslatef(x,y,z);//移動
glRotatef(angle,x,y,z);//轉動
glScalef(x,y,z);//縮放
glBegin(GL_POLYGON);//開始畫
glColor3f(r,g,b);//色彩
glTexCoord2f(tx,ty);//貼圖座標
glNormal3f(nx,ny,nz);//打光的法向量
glVertex2f(x,y);//頂點
glEnd();//結束畫
glTexCoord2f(tx,ty);//貼圖座標
glNormal3f(nx,ny,nz);//打光的法向量
glVertex2f(x,y);//頂點
glEnd();//結束畫
glPopMatrix();//還原矩陣
Step1:下載Glut和開啟codeblocks
有三個基礎的形狀:圓形、甜筒形狀、甜甜圈Step1-2:重寫新的
Step2:做一個以正中間為原點慢慢旋轉的白色長方形
程式碼:
#include <Gl/glut.h>
void upper_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();
glRotatef(angle,0,0,1);
upper_arm();
glPopMatrix();
angle++;
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week08");
glutIdleFunc(display);
glutDisplayFunc(display);
glutMainLoop();
}
Step2-2:多加一行程式碼,長方形往右移一點,更像肩膀固定中心在旋轉
程式碼:
#include <Gl/glut.h>
void upper_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();
glRotatef(angle,0,0,1);
glTranslatef(0.25,0,0);
upper_arm();
glPopMatrix();
angle++;
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week08");
glutIdleFunc(display);
glutDisplayFunc(display);
glutMainLoop();
}
Step3:最上面T移到想放的地方(整個就會在某個地方旋轉)
程式碼:
#include <Gl/glut.h>
void upper_arm()///畫手的函式
{
glPushMatrix();
glScalef(1,0.3,0.3);///x不變但YZ變1/3
glutSolidCube(0.5);
glPopMatrix();
}
float angle=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(0.5,0.5,0);///把整個轉動的手肘掛到右上角
glRotatef(angle,0,0,1);///對Z軸做旋轉 以正中心為原點旋轉 像時鐘
glTranslatef(0.25,0,0);///整個往右移 把旋轉中心放到畫面正中心
upper_arm();///呼叫前面畫手的函式
glPopMatrix();
angle++;
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week08");
glutIdleFunc(display);
glutDisplayFunc(display);
glutMainLoop();
}
Step4:分成上手臂和下手臂(右手部分)
程式碼:
#include <Gl/glut.h>
void arm()///畫手的函式
{
glPushMatrix();
glScalef(1,0.3,0.3);///x不變但YZ變1/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);///對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();
angle++;
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week08");
glutIdleFunc(display);
glutDisplayFunc(display);
glutMainLoop();
}
Step4-2:再來要對稱,左手出現:
程式碼:
#include <Gl/glut.h>
void arm()///畫手的函式
{
glPushMatrix();
glScalef(1,0.3,0.3);///x不變但YZ變1/3
glutSolidCube(0.5);
glPopMatrix();
}
float angle=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///右上(又邊最外層的PUSH)
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();///右邊最外層的POP
glPushMatrix();///左上(左邊最外層的PUSH)
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();///左邊最外層的POP
angle++;
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week08");
glutIdleFunc(display);
glutDisplayFunc(display);
glutMainLoop();
}










沒有留言:
張貼留言