Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

IDI - S4 - TG de càmera i models

No description
by

Alex Rios

on 2 October 2018

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of IDI - S4 - TG de càmera i models

Index
Introducció
Transformacions de càmera amb glm
Càrrega de models
Paràmetres de càmera
zbuffer
Feina per avui

Àlex Ríos
Interacció i disseny d'interficies
Laboratori d'IDI
Pinta una casa amb colors a cada vertex
S'ha afegit una TG de model que consisteix en un escalat modificable amb el teclat.
Al vèrtex shader es passa un color per a cada vèrtex
Nou codi base
Laboratori d'IDI
Transformacions de càmera
Laboratori d'IDI
Transformació de projecció
Amb una matriu decidim si volem càmera ortogonal o perspectiva
És la darrera matriu que s'aplica als vèrtexs.
Laboratori d'IDI
Transformació de projecció
Paràmetres de la Project Matrix (òptica)
FOV (field of view) angle d'obertura de la càmera
znear, zfar distàncies als plans de retallat
raw aspect ratio del window




Paràmetres de la View Matrix (posició). Es poden
donar de dues maneres
Angles d'Euler
Posició d'observador, VRP, view-up vector
Laboratori d'IDI
Transformació de projecció
Inicialment, per defecte, OpenGL tracta amb càmera ortogonal.
Programarem l'aplicació per a passar a càmera perspectiva
Per a fer-ho cal:
Crear la matriu de projecció a l'aplicació
Passar al vèrtex shader la matriu


Laboratori d'IDI
Transformació de projecció
Al MyGLWidget.cpp cal:

Demanar la localització de la uniform de la matriu definida al shader

projLoc=glGetUniformLocation(program->programID(), "proj")

Definir un mètode que calculi la transformació de projecció i enviï la matriu creada al shader a través de la localització

void MyGLWidget::projectTransform()
{
//glm::perspective(FOV en radians, ra window, znear, zfar)
glm::mat4 Proj=glm::perspective((float)M_PI/2.0f, 1.0f, 0.4f, 3.0f);
glUniformMatrix4fv(projLoc, 1, GL_FALSE, &Proj[0][0]);
}


El mètode projectTransform s'ha de cridar només quan faci falta: si canvien els paràmetres de la càmera
Laboratori d'IDI
Transformació de projecció
Al vertex shader afegir

...
uniform mat4 proj;
...

void main()
{
...
gl_Position=proj*...*vec4(vertex, 1.0);
}


Podem tenir aqui altres matrius, la darrera que s'aplica és la de projecció
Laboratori d'IDI
Transformació de visió
Amb una matriu especifiquem la posició, el punt de vista i el vector up de la càmera
Laboratori d'IDI
Transformació de visió
Laboratori d'IDI
Transformació de visió
Al MyGLWidget.cpp cal:

Demanar la localització de la uniform de la matriu definida al shader

viewLoc=glGetUniformLocation(program->programID(), "view")

Definir un mètode que calculi la transformació de punt de vista i enviï la matriu creada al shader a través de la localització

void MyGLWidget::viewTransform()
{
//glm::lookAt(OBS, VRP, up)
glm::mat4 View=glm::lookAt(glm::vec3(0,0,1),
glm::vec3(0,0,0),
glm::vec3(0,1,0));
glUniformMatrix4fv(viewLoc, 1, GL_FALSE, &View[0][0]);
}


El mètode viewTransform s'ha de cridar només quan faci falta: si canvien els paràmetres de la càmera
Laboratori d'IDI
Transformació de visió
Al vertex shader afegir

...
uniform mat4 view;
...

void main()
{
...
gl_Position=proj*view*...*vec4(vertex, 1.0);
}


Laboratori d'IDI
NOTA MOLT IMPORTANT

LA LLIBRERIA glm NOMÉS ES POT FER SERVIR A MyGLWidget!!!


Laboratori d'IDI
Càrrega de models OBJ
Laboratori d'IDI
Estructura de dades
Laboratori d'IDI
Estructura de dades
La classe model té les propietats VBO_* que es poden fer servir directament a glBufferData
Laboratori d'IDI
Ús de la classe Model
Laboratori d'IDI
Exemples
Laboratori d'IDI
zbuffer
Activar el zbuffer (només cal fer-ho 1 cop):

glEnable(GL_DEPTH_TEST)

després de initializeOpenGLFunctions

Esborrar el buffer de profunditats a la vegada que el frame buffer

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


HEADERS += <el-vostre-directori>/Model/model.h
De moment treballeu amb el model HomerProves
Laboratori d'IDI
Feina per avui
1. Mirar i entendre el codi de /assig/idi/blocs/bloc2
2. Afegir les funcions projectTransform i viewTransform
3. Modificar el shader
4. Carregar el HomerProves
5. Visualitzar l'escena amb els paràmetres indicats

Tot al racó


Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

sizeof(GLfloat) * m.faces ().size () * 3 * 3 // nombre de bytes dels buffers
INCLUDEPATH += <el-vostre-directori>/Model
SOURCES+=<el-vostre-directori>/Model/model.cpp
Laboratori d'IDI
Dades d'entrada: una escena 3D + càmera
Dades de sortida: píxels en pantalla
Procediment: aplicar TG als vèrtexs per a calcular a quins píxels de pantalla es pinten els vèrtexs de l'escena donada l'òptica i la posició/orientació de la càmera
Objectiu
Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

Càmera
en OpenGL
Òptica
Posició/orientació
perspectiva
ortogonal
PROJECT MATRIX
VIEW MATRIX
IMPORTANT: primer m.load(), després createBuffers()
lookAt
Angles d'Euler
perspective
ortho
Laboratori d'IDI
Feina per avui
Introducció
Transformacions de càmera
Càrrega de models
zbuffer
Feina per avui

Exercici 1
Exercici 2
Exercici 4
Pas de dades del buffer de posicions cap a la GPU
glBufferData(GL_ARRAY_BUFFER,
sizeof(GLfloat) * m.faces().size() * 3 * 3,
m.VBO_vertices(), GL_STATIC_DRAW);
Full transcript