Week06
(1)主題:特定軸轉定 T-R-T
(2)主題:階層性轉動
補充一下:圖學OpenGL教學資源 >> 120.125.80.50/GL
(1)主題:特定軸轉定 T-R-T
1.Angle++; 自動轉動!!!
#include<GL/glut.h>
float angle=0; ///TODO:
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle, 0,0,1);
glutSolidCube(1); ///TODO:
glPopMatrix();
glutSwapBuffers();
angle++; ///TODO:
}
int main(int argc, char ** argv)
{
glutInit( &argc, argv );
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("07361092");
glutDisplayFunc(display);
glutIdleFunc(display); ///TODO: 閒閒有空時,就重畫畫面!!
}
2.拆解程式、理解程式!!!
#include<GL/glut.h>
float angle=0; ///TODO:
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,0,1); ///藍色的
glutSolidCube(1); ///方塊
glPopMatrix();
glutSwapBuffers();
angle++; ///TODO:
}
int main(int argc, char ** argv)
{
glutInit( &argc, argv );
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("07361092");
glutDisplayFunc(display);
glutIdleFunc(display); ///TODO: 閒閒有空時,就重畫畫面!!
glutMainLoop();
}
3.把關節點移到中心,再去旋轉!!!
#include<GL/glut.h>
float angle=0; ///TODO:
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle, 0,0,1); ///對中心轉動
glTranslatef(0.25 ,0 ,0); ///把關節移到中心
glScalef(0.5, 0.1, 0.1); ///細長的
glColor3f(0,0,1); ///藍色的
glutSolidCube(1); ///方塊
glPopMatrix();
glutSwapBuffers();
angle++; ///TODO:
}
int main(int argc, char ** argv)
{
glutInit( &argc, argv );
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("07361092");
glutDisplayFunc(display);
glutIdleFunc(display); ///TODO: 閒閒有空時,就重畫畫面!!
glutMainLoop();
}
4.整理一下程式碼,把關節移到中心,再把整個物件移到右上角,再去旋轉!!!
#include<GL/glut.h>
float angle=0; ///TODO:
void hand()
{
glPushMatrix();
glScalef(0.5, 0.1, 0.1); ///細長的
glColor3f(0,0,1); ///藍色的
glutSolidCube(1); ///方塊
glPopMatrix();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1); glutSolidCube(1);///畫個方塊當對照
glPushMatrix();
glTranslatef(0.5, 0.5, 0); ///(3)整個移到右上角掛著
glRotatef(angle, 0,0,1); ///(2)對中心轉動
glTranslatef(0.25 ,0 ,0); ///(1)把關節移到中心
hand();///呼叫那個細長的藍色的小手手
glPopMatrix();
glutSwapBuffers();
angle++; ///TODO:
}
int main(int argc, char ** argv)
{
glutInit( &argc, argv );
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("07361092");
glutDisplayFunc(display);
glutIdleFunc(display); ///TODO: 閒閒有空時,就重畫畫面!!
glutMainLoop();
}
(2)主題:階層性轉動
glPushMatrix();
...
glPushMatrix();
...
glPopMatrix();
glPopMatrix();
...
glPushMatrix();
...
glPopMatrix();
glPopMatrix();
Ex:機器人手臂
1.多加一層階層!!!!
#include<GL/glut.h>
float angle=0; ///TODO:
void hand()
{
glPushMatrix();///每個地方都要加,怕出錯
glScalef(0.5, 0.1, 0.1); ///細長的
glColor3f(0,0,1); ///藍色的
glutSolidCube(1); ///方塊
glPopMatrix();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1); glutSolidCube(0.5);///畫個方塊當對照
glPushMatrix();
glTranslatef(0.25, 0.25, 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();
glutSwapBuffers();
angle++; ///TODO:
}
int main(int argc, char ** argv)
{
glutInit( &argc, argv );
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("07361092");
glutDisplayFunc(display);
glutIdleFunc(display); ///TODO: 閒閒有空時,就重畫畫面!!
glutMainLoop();
}
2.多做個左邊!!
#include<GL/glut.h>
float angle=0; ///TODO:
void hand()
{
glPushMatrix();///每個地方都要加,怕出錯
glScalef(0.5, 0.1, 0.1); ///細長的
glColor3f(0,0,1); ///藍色的
glutSolidCube(1); ///方塊
glPopMatrix();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1); glutSolidCube(0.5);///畫個方塊當對照
glPushMatrix();///右半邊
glTranslatef(0.25, 0.25, 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.25, 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();
glutSwapBuffers();
angle++; ///TODO:
}
int main(int argc, char ** argv)
{
glutInit( &argc, argv );
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("07361092");
glutDisplayFunc(display);
glutIdleFunc(display); ///TODO: 閒閒有空時,就重畫畫面!!
glutMainLoop();
}







沒有留言:
張貼留言