電腦圖學 2023-05-24 Week15
1. 主題: 攝影機 Camera2. 主題: 投影、運鏡
gluPerspective(), gluLookAt()
3. 期末作品
小葉老師網址連結:https://jsyeh.org/3dcg10/
下載
data > data.zip
win32 > windows.zip
data.zip 解壓縮之後 windows\data(解壓後的data拉去windows資料夾下)
windows.zip > 下載 > windows\Projection.exe
glutLookAt()
eye從哪裡看
center看哪裡
eye center 決定攝影機的軸線,從eye射向center。攝影機照著軸線360度旋轉,由up向量決定。
分別調整 eye、center、up的參數,並觀察結果
fovy : field of view(y方向)視野的角度
建立攝影機視角
安裝Git GitBash
-cd desktop
-git clone https://github.com/Owoyayou/2023graphicsa
-cd 2023graphicsa
-start .
1. 在CodeBlocks開啟一個新的glut專案,將專案存在github中的2023graphicsa的資料夾中,並使用資料夾中final project/freeglut
2. 加入glOrtho(-ar*3,ar*3,-1*3,1*3,-100,+100);比對與原來成像的不同測試「透視投影」和「垂直投影」的差別
更改程式碼gluPerspective(60,ar,0.01,1000);比對與原來成像的不同
建立新攝影機
1. 在CodeBlocks開啟一個新的glut專案,將專案存在github中的2023graphicsa的資料夾中,並使用資料夾中final project/freeglut
2.修改程式碼
#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);
float ar=w/(float)h;
glutPostRedisplay();
}
int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("week15-2");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
}3.繼續修改程式碼
#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);///先切換到project矩陣
glLoadIdentity();///矩陣清空,成為單位矩陣
gluPerspective(60,ar,0.01,1000);
glMatrixMode(GL_MODELVIEW);///做好後馬上切回model view矩陣
glLoadIdentity();
gluLookAt(0,0,1, 0,0,0, 0,1,0);
glutPostRedisplay();
}
int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("week15-2");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
}修改final proj程式碼
開啟之前的final proj,修改程式碼,利用陣列紀錄關節
#include <stdio.h>
#include <GL/glut.h>
#include "glm.h"
GLMmodel*body=NULL;
GLMmodel*head=NULL;
GLMmodel*downarmL=NULL;
GLMmodel*downarmR=NULL;
GLMmodel*uparmL=NULL;
GLMmodel*uparmR=NULL;
GLMmodel*downlegL=NULL;
GLMmodel*downlegR=NULL;
GLMmodel*uplegL=NULL;
GLMmodel*uplegR=NULL;
int show[10] = {1,0,1,0,0,1,0,0,0,0};
int ID=2;
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=='4') ID=4;
if(key=='5') ID=5;
if(key=='6') ID=6;
if(key=='7') ID=7;
if(key=='8') ID=8;
if(key=='9') ID=9;
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){
body=glmReadOBJ("model/body.obj");
head=glmReadOBJ("model/head.obj");
downarmR=glmReadOBJ("model/downarmR.obj");
downarmL=glmReadOBJ("model/downarmL.obj");
uparmL=glmReadOBJ("model/uparmL.obj");
uparmR=glmReadOBJ("model/uparmR.obj");
downlegL=glmReadOBJ("model/downlegL.obj");
downlegR=glmReadOBJ("model/downlegR.obj");
uplegL=glmReadOBJ("model/uplegL.obj");
uplegR=glmReadOBJ("model/uplegR.obj");
}
if(ID==0) glColor3f(1,0,0);
else glColor3f(1,1,1);
if(show[0]) glmDraw(body, GLM_MATERIAL);
if(ID==1) glColor3f(1,0,0);
else glColor3f(1,1,1);
if(show[1]) glmDraw(head, GLM_MATERIAL);
if(ID==3) glColor3f(1,0,0);
else glColor3f(1,1,1);
if(show[3]) glmDraw(downarmL, GLM_MATERIAL);
if(ID==4) glColor3f(1,0,0);
else glColor3f(1,1,1);
if(show[4]) glmDraw(uparmL, GLM_MATERIAL);
glPushMatrix();
//glTranslatef(teapotX,teapotY,0);
glTranslatef(-1.213333, +0.400000, 0);
glRotatef(angle[5],0,0,1);
glTranslatef(1.213333, -0.400000, 0);
if(ID==5) glColor3f(1,0,0);
else glColor3f(1,1,1);
if(show[5]) glmDraw(uparmR, GLM_MATERIAL);
glPushMatrix();
glTranslatef(-1.919999, +0.080000, 0);
//glTranslatef(teapotX,teapotY,0);
glRotatef(angle[2],0,0,1);
glTranslatef(1.919999, -0.080000, 0);
if(ID==2) glColor3f(1,0,0);
else glColor3f(1,1,1);
if(show[2]) glmDraw(downarmR, GLM_MATERIAL);
glPopMatrix();
glPopMatrix();
if(ID==6) glColor3f(1,0,0);
else glColor3f(1,1,1);
if(show[6]) glmDraw(downlegR, GLM_MATERIAL);
if(ID==7) glColor3f(1,0,0);
else glColor3f(1,1,1);
if(show[7]) glmDraw(downlegL, GLM_MATERIAL);
if(ID==8) glColor3f(1,0,0);
else glColor3f(1,1,1);
if(show[8]) glmDraw(uplegL, GLM_MATERIAL);
if(ID==9) glColor3f(1,0,0);
else glColor3f(1,1,1);
if(show[9]) glmDraw(uplegR, GLM_MATERIAL);
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();
}
/*void keyboard(unsigned char key,int x,int y)
{
if(fin==NULL)
{
fclose(fout);
fin=fopen("file4.txt","r");
}
fscanf(fin,"%f %f",&teapotX,&teapotY);
display();
}*/
int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("Week12");
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);
glutMainLoop();
}
沒有留言:
張貼留言