一。旋轉
step1. 同week03-1,至https://jsyeh.org/3dcg10/下載windows.zip和data.zip並解壓縮,將data放至window後執行Transformation.exe
step2. 向上為Y軸,順時鐘旋轉為X軸正向,以左圖為標準,若數字增加則向右旋轉如右圖
step3. 上下為z軸,數字減少為向上旋轉,以左圖為基準,右圖為向上
step4. 若為不正常旋轉軸(ex.(1,1,0)),想像軸為烤肉竹籤旋轉
二。旋轉茶壺
step1. 參照week01-2打開
step2. 貼上上週程式碼
#include <GL/glut.h>
void display()
{
glutSolidTeapot(0.3);
glutSwapBuffers();
}
int main(int argc,char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("week03");
glutDisplayFunc(display);
glutMainLoop();
}
step3. 修改程式完成旋轉茶壺
#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[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("week03");
glutDisplayFunc(display);
glutIdleFunc(display);
glutMainLoop();
}
三。光線
step1. 開新專案叫week04-2_rotate_light,複製貼上上一個專案
step2. 在177行程式碼裡找到兩大段有關light的程式複製貼上
step3. build&run#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("week03");
myLight();
glutDisplayFunc(display);
glutIdleFunc(display);
glutMainLoop();
}
四。有顏色的旋轉茶壺
step1. 在transform範例中可交換swap translate和rotate程式,會造成自轉及公轉差異
step2. 旋轉
-調整glScale數值可讓車子變胖變瘦
-調整Translatef會移動視角
-調整Rotatef轉動整個世界
step3. 旋轉茶壺
-將第一個程式貼上修改
#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("week03");
glutDisplayFunc(display);
glutIdleFunc(display);
glutMainLoop();
}
step4. 複製第一個茶壺的程式並修改void display為
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();
glPushMatrix();
glRotatef(angle,0,1,0);///旋轉中的
glTranslatef(0.5,0,0);///移動到哪
glColor3f(1,1,0);///顏色
glTranslatef(0,0.55,0);
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
angle++;
}











沒有留言:
張貼留言