STEP01-1
1.去https://jsyeh.org.3dcg10下載data,window
2.data.zip裡的data丟進windows
3.解壓縮執行Transformation.exe
STEP01-2
1.試著旋轉Z軸
用右手了解座標系統,大拇指朝向自己定義Z軸,4拇指朝右邊定義X軸,4拇指朝上定義Y軸,於是決定旋轉軸後再調整欲旋轉之角度2.試著旋轉Y軸
3.試著旋轉X軸
STEP01-3
1.試著同時旋轉XY軸,結果:
模型向右下方向轉動,得旋轉軸:1.依照之前步驟打開codeblock開新專案,命名"week04-1_rotate"
2.拿出上周的程式碼,改造一下,獲得茶壺一個
3.宣告一個角度amgle,加上glRotatef(angle,0,1,0);第一個是宣告的角度,後面對應XYZ軸
4.另外加上angle++,使其數值得以變動
5.加上glutIdleFunc(display)意即有空idel時,就重畫面
6.程式碼狀態:
#include <GL/glut.h>
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[])//main()主函式 進階版
{
glutInit(&argc,argv);//把參數送給glutInit初始化
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);//雙緩衝區+3D深度功能
glutCreateWindow("week04");//開GLUT視窗
glutDisplayFunc(display);//顯示用的函式
glutIdleFunc(display);
glutMainLoop();
}
STEP02-2
白白的轉稍顯無聊,加上打光
1.從開啟專案時預設的程式碼幹走約20行的程式碼,得到結果:
#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[])//main()主函式 進階版
{
glutInit(&argc,argv);//把參數送給glutInit初始化
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);//雙緩衝區+3D深度功能
glutCreateWindow("week04-2");//開GLUT視窗
glutDisplayFunc(display);//顯示用的函式
glutIdleFunc(display);
myLight();
glutMainLoop();
}
2.補上述,宣告myLight,最後拿出來用
STEP02-3 加上顏色,並清掉背景,以黃色為例
2.在畫茶壺的程式碼前加上glColor3f(1,1,0);使其成為黃色
3.在清背景的程式碼前加上glClearColor(1,1,1,1);
現在程式碼狀態:
#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()
{
glClearColor(1,1,1,1); //清背景的顏色:RGBA,其中A沒用到
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle,0,1,0);
glColor3f(1,1,0);
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
angle++;
}
int main(int argc, char *argv[])//main()主函式 進階版
{
glutInit(&argc,argv);//把參數送給glutInit初始化
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);//雙緩衝區+3D深度功能
glutCreateWindow("week04-3");//開GLUT視窗
glutDisplayFunc(display);//顯示用的函式
glutIdleFunc(display);
myLight();
glutMainLoop();
}
STEP03-1
1.在Transformation.exe中的移動旋轉兩行按右鍵做位置交換
2.我們發現一個是自轉,一個是繞著正中心轉(公轉),轉的中心點不一樣
STEP03-2
1.寫出兩個茶壺,並改變其中一個移動旋轉位置做對照,可以加上顏色,以利觀察,如附圖:

沒有留言:
張貼留言