Transformaciones y Procesador de vértices

Transcripción

Transformaciones y Procesador de vértices
Modelos 3D – Vértices / triángulos
Triángulos
Vértice X,Y,Z
Matríces
• Hablamos de transformaciones lineales
representables con matrices de 4 x4
Transformaciones típicas
• Modelado
– Trasladar (X, Y, Z)
– Rotar(ángulo, EjeX, EjeY, EjeZ)
– Escalar(X, Y, Z)
Mt
Mr
Me
• Vista
– Es una combinación de traslaciones y rotaciones
Mv= T * R * T
• Proyección
– Perspectiva, Ortográfica
Mp
Sistemas de Coordenadas
• Matríz de Modelado
– De Coord. Modelado -> Coord. de Mundo
• Matríz de Vista
– De Coord. de Mundo -> Coord. De Camara
• Matríz de Proyección
– De Coord de Cámara -> Coord de Pantalla
(clipping)
Matríces de Modelado
Sistema de coordenadas
de modelado
Sistema de coordenadas
de mundo
Transformaciones
De Modelado
Modelo
IMPORTANTE: Hay 4 instancias del modelo “tetera”
cada instancia requiere una matríz de modelado distinta
Matríz de Vista
Sistema de
coordenadas
de vista
(origen de cámara)
Sistema de
coordenadas
de mundo
Matríz de Vista
Sistema de
coordenadas
de mundo
Sistema de
coordenadas
de vista
(origen de cámara)
Librería gl-matrix.js (glmatrix.net)
Funciones matemáticas para el manejo de Matrices y
Vectores. Hay dos versiones disponibles 1.x y 2.x
Formato general de las funciones sobre matrices
mat4.<operación>(output, input ,param. de operación)
var m1 = mat4.create(); // m1=identidad
mat4.translate(m1, m1, [0, 0, -10]); // trasladar -10 en Z
mat4.rotate(m1, m1, Math.PI/2, [0, 1, 0]); // Rotar 90 grados
mat4.scale(m1, m1, [2, 2, 2]); // escalar 200%
mat4.scale=(m2,m1,[5,5,5]);
//
//
m1= Mtras * Mrot * Mesc
m2= Mesc * m1
mat2
mat3
mat4
Vec2
Vec3
vec4
Cálculo de Matríz de Vista
mat4.lookAt(outputMat,
cameraPosition, // posición de la cámara en el mundo
cameraTarget, // punto al cual mira la cámara en el mundo
upVector
// si Z es arriba, comunmente glm::vec3(0,0,1)
);
Vista en Pantalla
Matríz de Proyección
2D
Transformación
De Proyección
X,Y,Z
X,Y
Concatenación de transformaciones
Mt= Mt1 * Mr2 * Me3
V´=Mt * V
Espacio Modelado
Me3
Escalar x 2
Espacio de Mundo
Mr2
Rotar 45º
Mt1
Trasladar
X + 10
Concatenación de transformaciones
Espacio Modelado
Espacio de Mundo
Me3
Mr2
Mt1
Secuencia de transformaciones
Paso 1) Escalar (2,2,2)
Paso 2) Rotar (45,0,0,1)
Paso 3) Trasladar (10,0,0)
duplicar escala
45º respecto de Z
trasladar 10 en X
Concatenación de transformaciones
Espacio Modelado
Espacio de Mundo
Me3
Mr2
Mt1
Código JS (atención!!! El último paso se hace primero)
m1=mat4.create()
mat4.translate(m1,m1, [trX,trY,trZ]])
mat4.rotate(m1,m1,ang, (ejeX,ejeY,ejeZ))
mat4.scale(m1, m1,(escX,escY,escZ))
dibujarModelo(M);
m1=Identidad
m1=Mt1*I
m1=Mt1*Mr2*I
m1=Mt1*Mr2*Me3*I
Caso práctico – Escena 3D
llanta
cubierta
tuerca
chasis
eje
Espacio de modelado – objetos simples
Ejemplo – Objetos compuestos
Varias instancias de tuercas con diferentes
transformaciones de modelado
Objeto “Rueda” : Llanta + Cubierta
+ 8 Tuercas
Ejemplo – Objetos compuestos
Objeto “Tren”:
Eje + 2 Ruedas
Ejemplo – Objetos compuestos
Objeto “Auto”: Chasis + 2 Trenes
Ejemplo – Árbol de escena (scenegraph)
M1
Auto
M2
M3
Tren
delantero
Chasis
M4
Tren
trasero
M5
Rueda
Simples
Eje
Compuestos
M8
Cubierta
M7
Tuerca
M6
Llanta
MT=M1*M3*M4*M6
Ejemplo – dibujar objetos simples
1 dibujarCubierta(m){
// dibujar la superficie
}
2 dibujarLlanta(m) {
// dibujar la superficie
}
3 dibujarTuerca(m) {
// dibujar la superficie
}
4 dibujarChasis(m) {
// dibujar la superficie
}
5 DibujaEje(m) {
// dibujar la superficie
}
2
5
3
1
4
Ejemplo – dibujar Rueda
dibujarRueda(m4){
var m6=mat4.clone(m4) // copio por valor de m4 a m6
mat4.scale(m6,m6,[1.5 ,1.5 ,1.5]); m6=Mesc*m6
dibujarLlanta(m6);
var m8=mat4.create() // m8 = identidad, luego m8=Mesc*M4
mat4.scale(m8,m4,[2.0, 2.0, 2.0]); // escala x2
dibujarCubierta(m8);
for (i=0;i<8;i++){
var m7=mat4.create();
mat4.rotate(m7,m4, i*45, [0.0, 1.0, 0.0]);
// el ángulo depende de i
mat4.translate(m7, m7,[3.0, 0.0, 0.0]);
dibujarTuerca(m7); // m7= Mtras*Mrot*m4
}
}
Ejemplo – dibujar Tren
dibujarTren(m3){
var m5=mat4.clone(m3)
dibujarEje(m5); // m5=m3
var m4=mat4.create();
mat4.translate(m4,m3,[0.0, 40.0, 0.0]);
dibujarRueda(m4); // rueda derecha
// m4=Mtras*m3
var m4=mat4.create();
mat4.translate(m4,m3, [0.0, -40.0, 0.0]);
mat4.rotate(m4, m4, 180.0, [0.0, 0.0, 1.0]);
dibujarRueda(m4); // rueda izquierda
// m4= Mtras*Mrot*m3
}
IMPORTANTE: los ángulos en realidad deben expresarse en radianes, ej: Math.PI/2
Ejemplo – dibujar Auto
dibujarAuto(m1){
var m2=m1;
dibujarChasis(m2);
var angulo=velAngular * tiempo;
var m3=mat4.create();
mat4.translate(m3,m1,[100.0, 0.0, 0.0]);
mat4.rotate(m3,m3,angulo,[0.0, 1.0, 0.0]);
dibujarTren(m3); // tren trasero
var m3=mat4.create();
mat4.translate(m3,m1,[-100.0, 0.0, 0.0]);
mat4.rotate( m3,m3, angulo,[0.0, 1.0, 0.0]);
dibujarTren(m3); // tren delantero
}
Ejemplo – dibujar Auto
dibujarAuto{
dibujarChasis
dibujarTren{
dibujarEje
dibujarRueda{
… Idem …
}
dibujarRueda{
dibujarLlanta
dibujarCubierta
dibujarTuerca1
….
dibujarTuerca8
}
}
dibujarTren{
… Idem …
}
}
Auto
Tren
delantero
Cubierta
Auto
Rueda
Tren
Rueda
Eje
Tuerca
Llanta
Ejemplo – Escena 3D
El procesador de Vértices
Matríz de ModeladoVistaProyección Mat(4x4)
GPU – Vertex Unit
Programa de Vértices (GLSL)
Vértice 3D
Prog1 {
X, Y, Z
Vértice
transformado
X’, Y’, Z’
Vértice = MatrízMVP * Vértice
}

Documentos relacionados