Spirograph 萬花尺 介紹
1. T-R-T 轉動
- 畫轉動的方塊
- glutSolidCube 畫方塊
- angle++改變角度
- glutIdleFunc 空閒時繼續畫
#include <GL/glut.h>float angle=0;void display(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix();glRotated(angle,0,0,1);glutSolidCube(1);glPopMatrix();glutSwapBuffers();angle+=0.1;}int main(int argc, char **argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);glutCreateWindow("ME");glutDisplayFunc(display);glutIdleFunc(display);glutMainLoop();}
執行結果 :
- 改變大小、顏色
- Scale改變大小
- Color改變顏色
#include <GL/glut.h>float angle=0;void display(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix();glRotated(angle,0,0,1);glScalef(0.5,0.1,0.1);glColor3f(0,0,1);glutSolidCube(1);glPopMatrix();glutSwapBuffers();angle+=0.1;}int main(int argc, char **argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);glutCreateWindow("ME");glutDisplayFunc(display);glutIdleFunc(display);glutMainLoop();
}
執行結果:
- 改變轉動中心
- Translate 改變轉動的中心
#include <GL/glut.h>float angle=0;void display(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix();glRotated(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+=0.1;}int main(int argc, char **argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);glutCreateWindow("ME");glutDisplayFunc(display);glutIdleFunc(display);glutMainLoop();}
執行結果:
- 改變轉動中心+位移
- 紫字: 把畫方塊的程式碼放到hand()裡再呼叫他
- 橘字: 再Rotate上面增加Translate改變方塊位置
#include <GL/glut.h>float angle=0;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);glPushMatrix();glTranslatef(0.5,0.5,0);glRotated(angle,0,0,1);glTranslatef(0.25,0,0);hand();glPopMatrix();glutSwapBuffers();angle+=0.1;}int main(int argc, char **argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);glutCreateWindow("ME");glutDisplayFunc(display);glutIdleFunc(display);glutMainLoop();}
執行結果:
2.階層性轉動
- 增加一個旋轉方塊
- 藍字: 改變方塊大小讓旋轉方塊不超過界線,旋轉中心位置也要改變
- 橘字: 增加一個旋轉方塊,讓旋轉中心在第一個方塊的末端
#include <GL/glut.h>float angle=0;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);glRotated(angle,0,0,1);glTranslatef(0.25,0,0);hand();glPushMatrix();
glTranslatef(0.25,0,0);glRotated(angle,0,0,1);glTranslatef(0.25,0,0);hand();
glPopMatrix();glPopMatrix();glutSwapBuffers();angle++;}int main(int argc, char **argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);glutCreateWindow("ME");glutDisplayFunc(display);glutIdleFunc(display);glutMainLoop();}
執行結果:
- 增加左半邊的部分
- 藍字: 記得改負號
- 紅字: 複製右半邊的程式碼
#include <GL/glut.h>float angle=0;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);glRotated(angle,0,0,1);glTranslatef(0.25,0,0);hand();glPushMatrix();glTranslatef(0.25,0,0);glRotated(angle,0,0,1);glTranslatef(0.25,0,0);hand();glPopMatrix();glPopMatrix();
glPushMatrix();glTranslatef(-0.25,0.25,0);glRotated(-angle,0,0,1);glTranslatef(-0.25,0,0);hand();glPushMatrix();glTranslatef(-0.25,0,0);glRotated(-angle,0,0,1);glTranslatef(-0.25,0,0);hand();glPopMatrix();glPopMatrix();glutSwapBuffers();angle++;}int main(int argc, char **argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);glutCreateWindow("ME");glutDisplayFunc(display);glutIdleFunc(display);glutMainLoop();}






沒有留言:
張貼留言