2019年5月31日 星期五

PJ週記 - Week15之攝影機與運鏡

(*)前置作業

下載[data][win32][glut32.dll]
把資料用成下圖


把freeglut資料夾丟桌面 丟桌面 丟桌面

複製lib裡面的freeglut.a>>複製貼上>>改成libglut32.a















(一)先畫出模型


1.先用CodeBlocks開啟一個GLUT專案

2.上面下載的data資料夾freeglut>bin

3.將source裡的glm.hglm.cprojection.c移進專案資料夾

4.將glm.c 改成 glm.cpp

如下圖


然後將CodeBlocks中的main.cpp程式碼
全數改成下列程式碼


#include <GL/glut.h>
#include "glm.h" ///for glmReadOBJ()....
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();
}


就會出現模型的樣子!!
會缺法顏色、樣子及立體感
就是因為少了打光!!!






(二)打光


在int main主函式中
glutDisplayFunc後面加上

    GLfloat light_pos[] = { 0.0, 0.0, -1.0, 0.0 }; ///打光的位置
    glEnable(GL_DEPTH_TEST);///有立體的功能
    glEnable(GL_LIGHT0);    ///打光後變立體的彩色的
    glEnable(GL_LIGHTING);  ///打光後變立體的彩色的
    glLightfv(GL_LIGHT0, GL_POSITION, light_pos); ///打光的位置


就會出現有顏色的背影了







(三)有色彩旋轉中的人影





(四)有色彩旋轉中打光過的人影




 

(五)有色彩旋轉中打光過拉近的人影






Tokoyami_world.exe_week15

攝影機、運鏡

今天是最後一堂課程──運鏡

首先......應該都知道了吧,跟平常一樣,做完平常都會做的前置作業,接著就可以開始今天的課程了,首先把模型匯入......

DannyLo筆記 Week15

本周主題:攝影機運鏡,投影

投影

1.開啟Projection程式

2.
        Eye----> 眼睛位置 (也就是相機位置)
    Center---->相機所拍的正中心要在哪
 Up---->相機 "自身" 的轉動

------------------------------------------------------------程式--------------------------------------------------------
1.打開source資料夾,把三個丟到專案資料夾中

2.把glm.c改成glm.cpp

3.在codeblock的專案中 右鍵 ADD file 把glm.cpp加進來

4.然後把data 模型資料夾放到 freeglut的bin資料夾中

5.然後把projection中的程式碼取代掉main.cpp中的程式

Step01-1 做出白白的人 沒有打光 所以只有模型


Step01-2 打光


Step01-3 旋轉運鏡 (破圖)


Step01-4 旋轉運鏡 (改center 往上移 可把鏡調高)


Step01-5 旋轉運鏡(更改鏡頭)

week15

先試玩並觀察 Projection



freeglut下載及前置作業







下載Source


複製檔案加入week15_projection 



匯入codeblock裡面



顯示出白色的人影
程式碼:
#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();
}

week15

前面就是一模模一樣樣的把glut專案下載開啟
然後依照老師所給的程式碼
跑出下圖的白色猩猩
因為沒有打光 所以才會跑出白色猩猩
打光完 猩猩的背面就出來囉~~~
只是因為視角的緣故 所以只能看到後面
再來為了讓他向MV一樣的旋轉畫面 所以加了一些程式碼
不過因為角度的關係 所以他的臉有點破圖了
隨後 增加了攝影機的角度
glMatrixMode(GL_PROJECTION);///NOW4
    glLoadIdentity();///NOW4
glOrtho(-1,+1, -1,+1, -10,+10);///NOW4 可以看到範圍比較大的投影法
視角就會隨著人物選旋轉~~
 gluPerspective(60, 1, 0.001, 1000);///NOW5
把原本的看到範圍比較大的程式碼刪掉
加了這行就可以放大旋轉囉~







eyes → 眼睛看向的地方
center → 圖片中心






把 projection.c程式貼進來



*背光




*會轉 頭是破掉的

















*會轉 頭是完整的