運鏡
把 glm.c , glm.h , projection.c 複製到Week15裡
並把 glm.c 改成 glm.cpp
Week15右鍵 Add files... , 選取 glm.cpp
並把data放進 freeglut > bin
把 projection.c 裡的程式碼複製進 codeblocks 裡
執行↓↓↓↓↓
-----------------------------------------------------------------
(打光不正確)程式碼↓↓↓↓↓
#include <GL/glut.h> #include "glm.h" ///for glmReadOBJ(), glmDraw(), glmUnitized().... GLMmodel * pmodel=NULL;///NOW void drawmodel(void) { if (!pmodel) { pmodel = glmReadOBJ("data/al.obj"); if (!pmodel) exit(0); glmUnitize(pmodel); glmFacetNormals(pmodel); glmVertexNormals(pmodel, 90.0); } glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); drawmodel(); glutSwapBuffers(); } int main(int argc, char**argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(500,500); glutCreateWindow("week15"); glutDisplayFunc(display); glutMainLoop(); }
執行結果↓↓↓↓↓
打光,程式碼↓↓↓↓↓
#include <GL/glut.h> #include "glm.h" ///for glmReadOBJ(), glmDraw(), glmUnitized().... GLMmodel * pmodel=NULL;///NOW void drawmodel(void) { if (!pmodel) { pmodel = glmReadOBJ("data/al.obj"); if (!pmodel) exit(0); glmUnitize(pmodel); glmFacetNormals(pmodel); glmVertexNormals(pmodel, 90.0); } glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); drawmodel(); glutSwapBuffers(); } int main(int argc, char**argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(500,500); glutCreateWindow("week15"); glutDisplayFunc(display); GLfloat light_pos[] = { 0.0, 0.0, -1.0, 0.0 };///NOW2 打光的位置 glEnable(GL_DEPTH_TEST);///NOW2 有立體的功能 glEnable(GL_LIGHT0); ///NOW2 打光後變立體的彩色的 glEnable(GL_LIGHTING); ///NOW2 打光後變立體的彩色的 glLightfv(GL_LIGHT0, GL_POSITION, light_pos);///NOW2 打光的位置 glutMainLoop(); }
執行結果↓↓↓↓↓
讓模型旋轉(但是會破圖),程式碼↓↓↓↓↓
#include <GL/glut.h> #include "glm.h" ///for glmReadOBJ(), glmDraw(), glmUnitized().... GLMmodel * pmodel=NULL;///NOW void drawmodel(void) { if (!pmodel) { pmodel = glmReadOBJ("data/al.obj"); if (!pmodel) exit(0); glmUnitize(pmodel); glmFacetNormals(pmodel); glmVertexNormals(pmodel, 90.0); } glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); drawmodel(); glutSwapBuffers(); } #include <math.h> float eyeX=1, eyeY=0, eyeZ=0; void timer(int t)///NOW3 { glutTimerFunc(33, timer, t+1);///NOW3 float angle=t/180.0*3.1415926;///NOW3 算出一個角度 eyeX=cos(angle); eyeZ=sin(angle);///NOW3 glMatrixMode(GL_MODELVIEW);///NOW3 glLoadIdentity();///NOW3 gluLookAt(eyeX, eyeY, eyeZ, ///NOW3 LookAt的 eye 0.0, 0.8, 0.0, ///NOW3 LookAt的 center 0, 1, 0);///NOW3 LookAt的 up glutPostRedisplay();///NOW3 Re-display } int main(int argc, char**argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(500,500); glutCreateWindow("week15"); glutDisplayFunc(display); glutTimerFunc(33, timer, 0);///NOW3 GLfloat light_pos[] = { 0.0, 0.0, -1.0, 0.0 };///NOW2 打光的位置 glEnable(GL_DEPTH_TEST);///NOW2 有立體的功能 glEnable(GL_LIGHT0); ///NOW2 打光後變立體的彩色的 glEnable(GL_LIGHTING); ///NOW2 打光後變立體的彩色的 glLightfv(GL_LIGHT0, GL_POSITION, light_pos);///NOW2 打光的位置 glutMainLoop(); }
執行結果↓↓↓↓↓
(透視矩陣)運鏡,程式碼↓↓↓↓↓
#include <GL/glut.h> #include "glm.h" ///for glmReadOBJ(), glmDraw(), glmUnitized().... GLMmodel * pmodel=NULL;///NOW void drawmodel(void) { if (!pmodel) { pmodel = glmReadOBJ("data/al.obj"); if (!pmodel) exit(0); glmUnitize(pmodel); glmFacetNormals(pmodel); glmVertexNormals(pmodel, 90.0); } glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); drawmodel(); glutSwapBuffers(); } #include <math.h> float eyeX=1, eyeY=0, eyeZ=0; void timer(int t)///NOW3 { glutTimerFunc(33, timer, t+1);///NOW3 float angle=t/180.0*3.1415926;///NOW3 算出一個角度 eyeX=cos(angle); eyeZ=sin(angle);///NOW3 glMatrixMode(GL_PROJECTION);///NOW4 glLoadIdentity();///NOW4 glOrtho(-1,+1, -1,+1, -10,+10);///NOW4 可以看到範圍比較大的投影法 glMatrixMode(GL_MODELVIEW);///NOW3 glLoadIdentity();///NOW3 gluLookAt(eyeX, eyeY, eyeZ, ///NOW3 LookAt的 eye 0.0, 0.6, 0.0, ///NOW3 LookAt的 center 0, 1, 0);///NOW3 LookAt的 up glutPostRedisplay();///NOW3 Re-display } int main(int argc, char**argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(500,500); glutCreateWindow("week15"); glutDisplayFunc(display); glutTimerFunc(33, timer, 0);///NOW3 GLfloat light_pos[] = { 0.0, 0.0, 1.0, 0.0 };///NOW2 打光的位置 glEnable(GL_DEPTH_TEST);///NOW2 有立體的功能 glEnable(GL_LIGHT0); ///NOW2 打光後變立體的彩色的 glEnable(GL_LIGHTING); ///NOW2 打光後變立體的彩色的 glLightfv(GL_LIGHT0, GL_POSITION, light_pos);///NOW2 打光的位置 glutMainLoop(); }
執行結果↓↓↓↓↓
(垂直矩陣)運鏡,程式碼↓↓↓↓↓
#include <GL/glut.h> #include "glm.h" ///for glmReadOBJ(), glmDraw(), glmUnitized().... GLMmodel * pmodel=NULL;///NOW void drawmodel(void) { if (!pmodel) { pmodel = glmReadOBJ("data/al.obj"); if (!pmodel) exit(0); glmUnitize(pmodel); glmFacetNormals(pmodel); glmVertexNormals(pmodel, 90.0); } glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); drawmodel(); glutSwapBuffers(); } #include <math.h> float eyeX=1, eyeY=0, eyeZ=0; void timer(int t)///NOW3 { glutTimerFunc(33, timer, t+1);///NOW3 float angle=t/180.0*3.1415926;///NOW3 算出一個角度 eyeX=cos(angle); eyeZ=sin(angle);///NOW3 glMatrixMode(GL_PROJECTION);///NOW4 glLoadIdentity();///NOW4 gluPerspective(60, 1, 0.001, 1000);///NOW5 ///glOrtho(-1,+1, -1,+1, -10,+10);///NOW4 可以看到範圍比較大的投影法 glMatrixMode(GL_MODELVIEW);///NOW3 glLoadIdentity();///NOW3 gluLookAt(eyeX, eyeY, eyeZ, ///NOW3 LookAt的 eye 0.0, 0.6, 0.0, ///NOW3 LookAt的 center 0, 1, 0);///NOW3 LookAt的 up glutPostRedisplay();///NOW3 Re-display } int main(int argc, char**argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(500,500); glutCreateWindow("week15"); glutDisplayFunc(display); glutTimerFunc(33, timer, 0);///NOW3 GLfloat light_pos[] = { 0.0, 0.0, 1.0, 0.0 };///NOW2 打光的位置 glEnable(GL_DEPTH_TEST);///NOW2 有立體的功能 glEnable(GL_LIGHT0); ///NOW2 打光後變立體的彩色的 glEnable(GL_LIGHTING); ///NOW2 打光後變立體的彩色的 glLightfv(GL_LIGHT0, GL_POSITION, light_pos);///NOW2 打光的位置 glutMainLoop(); }
執行結果↓↓↓↓↓
沒有留言:
張貼留言