2023年5月24日 星期三

deverra//week15攝影機 運鏡

 

WEEK15
-------------------------------------------------------------------------------------------------------------------------------
到老師的範例課本中找到Projection 了解投影的效果及運鏡----> https://jsyeh.org/3dcg10/

可以看到有9個參數分別表示eye center up
各別參數都對應調整不同的鏡頭位置
eye---> 現在鏡頭注視的方向

center--->希望調整的鏡頭中心點

up--->鏡頭的方向


第一排能看到4個參數分別是fovy aspect zNear zFar
各別參數對應調整投影"畫面"的調整
fovy--->調整視野的角度

aspect--->調整畫面的長寛比

zNear, zFar--->調整投影後面的位置


----------------------------------------------------------------------------------------------------------------------------
▨第一個專案

開啟一個glut專案,在第35行中加入

static void resize(int width, int height)
{
    const float ar = (float) width / (float) height;
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
   
//glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
    glOrtho(-ar*3,ar*3,-1*3,1*3,-100,+100);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
}


static void resize(int width, int height)
{
    const float ar = (float) width / (float) height;
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
///切換成投影矩陣
    glLoadIdentity(); ///還原成單位矩陣
    //glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
    //glOrtho(-ar*3,ar*3,-1*3,1*3,-100,+100);
    gluPerspective(60,ar,0.01,1000);
    glMatrixMode(GL_MODELVIEW); ///切換成model view矩陣
    glLoadIdentity() ; ///還原成單位矩陣
}

----------------------------------------------------------------------------------------------------------------------------
▨第二個專案 -- 透視投影

得到圓滾滾小茶壺>///<

#include<GL/glut.h>
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}
void reshape(int w, int h)
{
   
glViewport(0,0,w,h); ///視窗裡會看到的2D範圍
    float ar = w/(float)h; ///aspect ratio長寛比
    glMatrixMode(GL_PROJECTION); ///臨時切換projection矩陣
    glLoadIdentity(); ///矩陣清空成為單位矩陣(最一開始的矩陣)


    gluPerspective(60,ar,0.01,1000);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();


    gluLookAt(0,0,1, 0,0,0, 0,1,0);
    glutPostRedisplay();
}
int main(int argc, char *argv[])
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
  glutCreateWindow("week15");
  glutDisplayFunc(display);
  glutReshapeFunc(reshape);
  glutMainLoop();
}


**調整長寛比後茶壺會根據我們小黑的長寛變形

**新增投影點之後發現小黑是全白的
因為此時我們離茶壺太近了 視角在茶壺裡

**新增lookup

float eyeX=0, eyeY=0;
void motion( int x, int y)
{
    eyeX= (x-150.0)/150.0;
    eyeY= (150.0-y)/150.0;

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(eyeX, eyeY, 1, 0,0,0, 0,1,0);
    glutPostRedisplay();
}
int main(int argc, char *argv[])
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
  glutCreateWindow("week15");
  glutMotionFunc(motion);
  glutDisplayFunc(display);
  glutReshapeFunc(reshape);
  glutMainLoop();
}


----------------------------------------------------------------------------------------------------------------------------
▨第三個專案 -- 續做final
//WEEK15-FINAL-陣列
#include <stdio.h>
#include <GL/glut.h>
#include "glm.h"
GLMmodel * head = NULL;
GLMmodel * body = NULL;
GLMmodel * uparmR = NULL;
GLMmodel * lowarmR = NULL;
int show[4] = {0, 1, 0, 0};
int ID = 0;
void keyboard(unsigned char key, int x, int y)
{
    if(key=='0') ID = 0;
    if(key=='1') ID = 1;
    if(key=='2') ID = 2;
    if(key=='3') ID = 3;
    if(key=='s')
    {
        if(fout==NULL) fout= fopen("motion.txt","w");
        for(int i=0;i<20;i++)
        {
            fprintf(fout,"%.2f", angle[i]);
        }
        fprintf(fout, "\n");
    }else if(key=='r')
    {
        if(fin==NULL) fin=fopen("motion.txt","r");
        for(int i=0;i<20;i++)
        {
            fscanf(fin, "%f", &angle[i]);
        }
    }
    glutPostRedisplay();
}
FILE * fout = NULL;
FILE * fin = NULL;
float teapotX=0, teapotY=0;
//float angle=0, angle2=0, angle3=0;
float angle[20]={};
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glScalef(0.2, 0.2, 0.2);
        if(body==NULL)
            {
            head = glmReadOBJ("model/head.obj");
            body = glmReadOBJ("model/body.obj");
            uparmR = glmReadOBJ("model/uparmR.obj");
            lowarmR = glmReadOBJ("model/lowarmR.obj");

        }
        if(ID == 2)glColor3f(1,0,0);
        else glColor3f(1,1,1);
        if(show[2]) glmDraw(uparmR, GLM_MATERIAL);
        glPushMatrix();
            glTranslatef(-1.959999, +0.113333,0);
            glRotatef(angle[3],0,0,1);
            glTranslatef(1.959999, -0.113333,0);

            if(ID == 3)glColor3f(1,0,0);
            else glColor3f(1,1,1);
            if(show[3]) glmDraw(lowarmR, GLM_MATERIAL);
        glPopMatrix();

    glPopMatrix();
    glColor3f(0,1,0);
    glutSolidTeapot(0.02);
    glutSwapBuffers();
}
int oldX = 0, oldY = 0;
void motion(int x, int y){
    teapotX += (x - oldX)/150.0;
    teapotY -= (y - oldY)/150.0;
    angle[ID]+=( x-oldX );
    oldX = x;
    oldY = y;
    printf("glTranslatef(%f, %f, 0);\n", teapotX, teapotY);
    glutPostRedisplay();
}
void mouse(int button, int state, int x, int y)
{
    if(state==GLUT_DOWN){
        oldX = x;
        oldY = y;
        angle = x;

    }
    display();
}
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week15");

    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutKeyboardFunc(keyboard); 

    glutMainLoop();
}


沒有留言:

張貼留言