-------------------------------------------------------------------------------------------------------------------------------
到老師的範例課本中找到Projection 了解投影的效果及運鏡----> https://jsyeh.org/3dcg10/
各別參數都對應調整不同的鏡頭位置
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();
}










沒有留言:
張貼留言