Week04
Step01
延續上個禮拜到https://jsyeh.org/3dcg10/
下載window.zip和data.zip壓縮檔
並把兩個壓縮檔解壓縮
把data資料夾解壓縮在windows資料夾裡
然後執行transformation.exe
這周要教的是glRotatef 旋轉
試試看X軸的旋轉 是怎麼轉的
試試看Y軸的旋轉 是怎麼轉的
試試看Z軸的旋轉 是怎麼轉的
利用大拇指去比軸的方向 再看其他四隻手指指的方向
就能知道這個軸旋轉的方向是哪裡
再來思考 如果是glRotatef(1.00 , 1.00 , 0.00);
想有一根竹子綁成這個方向在這個人身上
同理 利用大拇指也比這個方向 觀察其他四指的方向
就能知道旋轉的方向怎麼轉
當把 translate 和 rotate的程式 換回來
Step02
開啟CodeBlocks 並開啟GLUT專案 並下載把freeglut解壓縮
且把libfreeglut.a 複製改成libglut32.a
換上之前寫過的十行程式
並把程式修改成以下
#include <GL/glut.h>
float angle = 0; 全域變數 angle 角度
void 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); 重複畫面
glutMainLoop();
}
並且執行程式
把剛剛的程式碼複製貼上
並修改成以下程式碼
#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;
void display()
{
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle,0 ,1 ,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");
myLight();
glutDisplayFunc(display);
glutIdleFunc(display);
glutMainLoop();
}
紅色框框的部分 從最原始的GLUT檔
搜尋light 的部分 複製貼上到剛剛的程式碼
Step03
開啟剛剛的transformation.exe ,
可以交換 translate 和 rotate的程式
可以造出 公轉 與 自轉的差別
讀程式利用由下往上讀的方式來看整個程式
讀程式的順序就會變這樣
glBegin 這邊代表藍色的車子
glSclef 這邊代表長胖的藍色車子
glTranslatef 把車子移到右邊
glRotatef 轉動整個視角
就會變成自轉
把week04-1的程式拿來改寫為
以下程式
#include <GL/glut.h>
float angle = 0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(0.5, 0 , 0); 移動到右邊
glRotatef(angle,0 ,1 ,0); 旋轉中的
glColor3f(0, 0, 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);
glutMainLoop();
}
執行以上程式碼就會出現下面的畫面囉
移動到右邊的旋轉藍色茶壺
利用剛剛的程式碼再新增一些程式
讓一個黃色茶壺在上面邊旋轉邊移動
glPushMatrix();
glRotatef(angle,0 ,1 ,0);
glTranslatef(0.5, 0 , 0);
glColor3f(1, 1, 0);
glTranslatef(0, 0.5 , 0);
glutSolidTeapot( 0.3 );
glPopMatrix();
就會出現以下畫面囉
沒有留言:
張貼留言