2019年6月13日 星期四

彥の圖學筆記 Week15

電腦圖學

2019-05-30 Week15

(1) 主題:攝影機運鏡

Step1. 繪出模型

#include <GL/glut.h>///GLUT 外掛
#include "glm.h"///glm.cpp for 3D model glmReadOBJ(), glmDraw(), glmUnitized()
GLMmodel * pmodel=NULL;///指標
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_DEPTH | GLUT_DOUBLE);
    glutInitWindowSize(512,512);
    glutInitWindowPosition(50, 50);
    glutCreateWindow("week15");

//    glutReshapeFunc(reshape);
    glutDisplayFunc(display);

    glutMainLoop();

    return 0;
}

Step2. 模型打光

#include <GL/glut.h>///GLUT 外掛
#include "glm.h"///glm.cpp for 3D model glmReadOBJ(), glmDraw(), glmUnitized()
GLMmodel * pmodel=NULL;///指標
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_DEPTH | GLUT_DOUBLE);
    glutInitWindowSize(512,512);
    glutInitWindowPosition(50, 50);
    glutCreateWindow("week15");

//    glutReshapeFunc(reshape);
    glutDisplayFunc(display);

    GLfloat light_pos[] = { 0.0, 0.0, -1.0, 0.0 };
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
    glutMainLoop();

    return 0;
}

Step3. Timer函式:運鏡

#include <GL/glut.h>///GLUT 外掛
              #include "glm.h"///glm.cpp for 3D model glmReadOBJ(), glmDraw(), glmUnitized()
              GLMmodel * pmodel=NULL;///指標
              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>///for sin() cos() ///NOW3
              float eyeX=0.5, eyeY=0, eyeZ=0; ///NOW3
              void timer(int t)///NOW3
              {
                  float angle = (t/180.0)*3.1415926; ///NOW3
                  eyeX=0.5*cos(angle); ///NOW3
                  eyeZ=0.5*sin(angle); ///NOW3

                  glutTimerFunc(33, timer, t+1);///NOW3
                  glMatrixMode(GL_MODELVIEW);///NOW3
                  glLoadIdentity();///NOW3
                  gluLookAt( eyeX, eyeY, eyeZ,///eye ///NOW3
                          0, 0, 0,///center ///NOW3
                             0, 1, 0);///up    ///NOW3
              
                  glutPostRedisplay();///NOW3
              }
              int main(int argc, char** argv)
              {
                  glutInit(&argc, argv);
                  glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE);
                  glutInitWindowSize(512,512);
                  glutInitWindowPosition(50, 50);
                  glutCreateWindow("week15");
              //    glutReshapeFunc(reshape);
                  glutDisplayFunc(display);
                  glutTimerFunc(33, timer, 0);///NOW3
              
                  GLfloat light_pos[] = { 0.0, 0.0, -1.0, 0.0 };
                  glEnable(GL_DEPTH_TEST);
               glEnable(GL_LIGHTING);
                  glEnable(GL_LIGHT0);
                  glLightfv(GL_LIGHT0, GL_POSITION, light_pos);

                  glutMainLoop();

                  return 0;
              }

(2) 主題:投影、矩陣

在Timer函式新增以下三行
1. glMatrixMode(GL_PROJECTION);
2. glLoadIdentity();
3. glOrtho(-1,+1,-1,+1,-10,+10);
/// -10和+10就像是眼鏡,範圍不夠大,身體會斷東斷西

(3) 複習:位置移動&轉動

(4) 複習:背景貼圖

(5) 期末作業

沒有留言:

張貼留言