電腦圖學 第08週 2020-04-21
1. 期中考: OpenGL必背10函式 (老師有模擬考系統 http://120.96.99.55 )
2. 主題: glu/glut函式
4. 階層式移動、階層式轉動
5. T-R-T (像關節一樣的)轉動
6. 下週小考(機器人的關節轉動)、下下週交作業(簡單的機器人)
-----------------------------------------------------------------------------------------------------
將一個物品旋轉:
#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);///對z軸旋轉
upper_arm();///函式呼叫
glPopMatrix();///還原矩陣
angle++;///角度增加
glutSwapBuffers();
}
int main(int argc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("week09-1");
glutIdleFunc(display);
glutDisplayFunc(display);
glutMainLoop();
}
--------------------------------------------------------------------------------------------------------------------------
但是我是想要讓物品的一端為圓心旋轉,於是再多一行:
#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);///對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("week09-1");
glutIdleFunc(display);
glutDisplayFunc(display);
glutMainLoop();
}
--------------------------------------------------------------------------------------------------------------------------
如果要將物件移到右上角作旋轉的話則是再多一行(俗稱的T-R-T)
#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();///備份
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("week09-1");
glutIdleFunc(display);
glutDisplayFunc(display);
glutMainLoop();
}
--------------------------------------------------------------------------------------------------------------------------
如果要做成像手臂那樣子的則是這樣:
#include<Gl/glut.h>
void arm()
{
glPushMatrix();///備份矩陣
glScalef(1,0.3,0.3);
glutSolidCube(0.5);
glPopMatrix();///還原矩陣
}
float angle=0;
float dx=1;
float dx=1;
void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();///備份(右手1)
glTranslatef(0.2,0,0);///把下面正在以手軸為中心,轉動的手掛到右上角去(整體包括世界移到右上角)
glRotatef(angle,0,0,1);///對z軸旋轉。再對正中心做轉動(開轉)
glTranslatef(0.25,0,0);///將整個物品做移動(單獨移動物件,世界不動)
glColor3f(1,0,0);///Red
arm();
glPushMatrix();///備份(右手2)
glTranslatef(0.25,0,0);///把下面正在以手軸為中心,轉動的手掛到右上角去(整體包括世界移到右上角)
glRotatef(angle,0,0,1);///對z軸旋轉。再對正中心做轉動(開轉)
glTranslatef(0.25,0,0);///將整個物品做移動(單獨移動物件,世界不動)
glColor3f(1,1,0);///Yellow
arm();
glPopMatrix();///還原矩陣(右手2)
glPopMatrix();///還原矩陣(右手1)
glPushMatrix();///備份(左手1)
glTranslatef(-0.2,0,0);///把下面正在以手軸為中心,轉動的手掛到右上角去(整體包括世界移到右上角)
glRotatef(-angle,0,0,1);///對z軸旋轉。再對正中心做轉動(開轉)
glTranslatef(-0.25,0,0);///將整個物品做移動(單獨移動物件,世界不動)
glColor3f(1,0,0);///Red
arm();
glPushMatrix();///備份(左手2)
glTranslatef(-0.25,0,0);///把下面正在以手軸為中心,轉動的手掛到右上角去(整體包括世界移到右上角)
glRotatef(-angle,0,0,1);///對z軸旋轉。再對正中心做轉動(開轉)
glTranslatef(-0.25,0,0);///將整個物品做移動(單獨移動物件,世界不動)
glColor3f(1,1,0);///Yellow
arm();
glPopMatrix();///還原矩陣(左手2)
glPopMatrix();///還原矩陣(左手1)
angle+=dx;///角度增加
if(angle>60) dx=-1;
if(angle<0) dx+=1;
if(angle>60) dx=-1;
if(angle<0) dx+=1;
glutSwapBuffers();
}
int main(int argc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("week09-1");
glutIdleFunc(display);
glutDisplayFunc(display);
glutMainLoop();
}
--------------------------------------------------------------------------------------------------------------------------




沒有留言:
張貼留言