glRotatef( 0.0, 0.00, 0.00, 0.00)
0.在https://jsyeh.org/3dcg10/中下載[data][win32] glut32.dll三個檔案 / 在資料夾中開啟後分別解壓縮 / 將data資料夾放到window裡
glRotatef( 0.0, 0.00, 0.00, 0.00)※0.0為控制角度※為1.00時X軸為旋轉軸※為1.00時Y軸為旋轉軸
※為1.00時Z軸為旋轉軸(右手手掌從X軸掃向Y軸的大拇哥方向)
⭐其他軸線ex.XY軸,YZ軸...,同樣是用右手手掌方法,拇指代表根據哪條軸旋轉,手掌旋轉方向為物體旋轉方向
1. 新增Project:選擇GLUT project / 檔案名稱week04_rotate / 小葉老師上課軟體 / freeglut檔案複製到桌面 / 將libfreeglut.a複製貼上後改成libglut32.a
Next / 選擇桌面freeglut檔 / Next / 執行
2.旋轉茶壺:將上週的程式碼改為
#include <GL/glut.h>float angle =0;///宣告global全域變數anglevoid display(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清背景glPushMatrix();///備分矩陣glRotatef( angle,0,1,0);///旋轉angle角度glutSolidTeapot( 0.3 );glPopMatrix();///還原矩陣glutSwapBuffers();angle++;///把角度++}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);glutCreateWindow("week04");glutDisplayFunc(display);glutIdleFunc(display);///有空idle時,就重畫畫面glutMainLoop();}
3.加入光線:開新檔案week04-2_rotate_light從原程式碼提取程式碼/並在main函式中加入myLight();
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };const GLfloat high_shininess[] = { 100.0f };void myLight(){glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LESS);glEnable(GL_LIGHT0);glEnable(GL_NORMALIZE);glEnable(GL_COLOR_MATERIAL);glEnable(GL_LIGHTING);glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);glLightfv(GL_LIGHT0, GL_POSITION, light_position);glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);}
4.加上顏色,清背景:
....
void display(){glClearColor(1,1,1,1);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix();///備分矩陣glRotatef( angle,0,1,0);///旋轉angle角度glColor3f(0,1,1);///加入顏色glutSolidTeapot( 0.3 );glPopMatrix();///還原矩陣glutSwapBuffers();angle++;///把角度++}
...
完整程式碼:
#include <GL/glut.h>const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };///將打光加進來const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };const GLfloat high_shininess[] = { 100.0f };void myLight(){glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LESS);glEnable(GL_LIGHT0);glEnable(GL_NORMALIZE);glEnable(GL_COLOR_MATERIAL);glEnable(GL_LIGHTING);glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);glLightfv(GL_LIGHT0, GL_POSITION, light_position);glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);}float angle =0;///宣告global全域變數anglevoid display(){glClearColor(1,1,1,1);///清背景glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清背景glPushMatrix();///備分矩陣glRotatef( angle,0,1,0);///旋轉angle角度glColor3f(0,1,1);///加入顏色glutSolidTeapot( 0.3 );glPopMatrix();///還原矩陣glutSwapBuffers();angle++;///把角度++}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);glutCreateWindow("week04");
glutDisplayFunc(display);glutIdleFunc(display);///有空idle時,就重畫畫面myLight();///記得加入myLight()函式glutMainLoop();}
5.自轉、公轉:開新檔案week04-3_rotate_translate / 複製week04_rotate程式碼 / 加入移動和色彩
#include <GL/glut.h>float angle =0;void display(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix();glTranslated(0.6,0,0);///先移動再旋轉glRotatef( angle,0,1,0);///自轉glColor3f(1,1,0);glutSolidTeapot( 0.3 );glPopMatrix();glPushMatrix();glRotatef( angle,0,1,0);///先旋轉再移動glTranslated(0.6,0,0);///公轉glColor3f(1,0,0);glutSolidTeapot( 0.3 );glPopMatrix();glutSwapBuffers();angle++;}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);glutCreateWindow("week04");glutDisplayFunc(display);glutIdleFunc(display);glutMainLoop();}
⭐口決:左耳靠左肩,由下往上讀程式碼,當Rotate在Translate外時公轉,在內時自轉


.png)
.png)
.png)

.png)
沒有留言:
張貼留言