Lo más importante es que convierte tus puntos (vértices) del espacio mundial 3D en el espacio de la pantalla 2D.
Eso significa que después de que el vértice se multiplica con esta matriz, los cables X e Y se colocan en la pantalla (entre [-1, 1]) y Z es la profundidad. Z se utiliza para el buffer de profundidad e identifica qué tan lejos está el vértice (o fragmento) de sus cámaras cerca del plano.
La proyección significa que los vértices que están más cerca del plano cercano están más lejos del centro de la pantalla -> el triángulo más cerca de la cámara parece ser más grande que el que está lejos. Y esto se basa en su campo de visión: lo está ingresando en alguna función createProjectionMatrix o createFrustum. Funciona que corta y escala el tronco de la cámara y los vértices en el cubo de la unidad. Los valores que son mayores que 1 y menores que -1 no se muestran.
También mantiene la relación de aspecto de píxeles, por lo que los píxeles pueden ser cuadrados. Eso es simple Simplemente corta el tronco de la cámara de esta manera: pantalla más ancha -> más corte vertical y viceversa.
Respuesta simple:
define el frustum de tu cámara y es bueno para:
- haga que los objetos que están cerca de usted se vean más grandes que los objetos que están lejos de usted.
- mantener la relación de aspecto de píxeles: a todos les gusta el píxel cuadrado, ¿verdad? :)
Esta respuesta es mucho después del hecho, pero desde que encontré esto en Google, tal vez esto ayude a alguien. Solo quiero aclarar lo que JasonD y Notabene decían: es mucho más fácil hacer cálculos de recorte (averiguar qué debería ver y qué no debería ver por la forma en que mira, qué tan lejos está, etc.) .). En lugar de verificar si las cosas se cruzan con los planos en los bordes de su vista, simplemente compare las x, y, z de todo con xMax, xMin, yMax, ect. , ya que simplemente tienes un cubo. Es un poco más complicado si solo quieres que se muestre una parte de algo, pero las matemáticas son aún mejores con un cubo unitario que con un tronco.
Un par de cosas que encontré engañosas en otras respuestas:
-No está cortando los lados del tronco de la vista, sino que lo está deformando en un cubo utilizando transformaciones de matriz homogéneas.
-No estamos convirtiendo a una pantalla 2D con este paso. Este paso no es necesario para hacerlo. Teóricamente podríamos hacer todo nuestro trabajo sin convertir primero el frustum en un cubo, lo que sería una matemática más intuitiva pero más difícil, pero los gráficos consisten en hacer cálculos realmente rápidos, ya que hay MUCHOS cálculos por segundo para el juego promedio / lo que sea.
Más detalles: no es necesariamente un cubo unitario al que nos estamos convirtiendo, solo tiene que ser una caja rectangular para que funcionen nuestros cálculos máximo-mínimo. De hecho, en la clase utilizamos un cuadro donde la cámara mira hacia abajo del eje z, z va de 0 a 1, x va de -1 a 1 e y va de -1 a 1. En general, en matemáticas 1, 0, y -1 son buenos números para facilitar los cálculos, supongo que es por eso que no pasamos de -100 a 100 o algo así.
TLDR: facilita el recorte.
Editar: bobobobo tiene la esencia de ello. Todo es triángulos, generalmente: D.
Fuente: tomar una clase de gráficos de la universidad
fuente
Creo que esto se debe a que OpenGL no puede hacer suposiciones sobre cómo se va a mostrar la imagen (relación de aspecto o resolución, detalles de hardware, etc.). Representa e imagen en una forma intermedia que el sistema operativo o controlador o lo que sea escala a la resolución / tamaño correcto.
fuente
Noto que ya se ha aceptado una respuesta, pero en general es útil para recortar que el frustum de la vista se transforme en un cubo unitario.
fuente
También me he estado preguntando esto. Hay un par de cosas a considerar.
Primero, sí, todo en el mundo se transforma en ese cubo unitario [-1,1] centrado alrededor del origen. Si algo no está en el cubo de esa unidad, entonces no se mostrará.
Lo bueno de esto es que ahora puedes eliminar triángulos con bastante facilidad. (Si los 3 vértices de un triángulo tienen
x > 1
ox < -1
entonces ese triángulo puede ser eliminado).fuente
Recomendaría consultar la lección sobre matriz de proyección en perspectiva en Scratchapixel
http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/build-basic-perspective-projection-matrix
Explica claramente que el motivo es deformar el espacio de la vista desde un cubo de unidades. ¿Por qué? Esencialmente porque el proceso de proyectar puntos 3D en el lienzo implica convertirlos en espacio NDC, que es un espacio en el que los puntos en la pantalla se reasignan en el rango [-1,1] (suponiendo que la pantalla es cuadrada). Ahora también reasignamos la coordenada Z del punto al rango [0,1] (o, a veces, [-1,1]), por lo que al final terminas con un cubo. El hecho es que cuando los puntos están contenidos en un cubo, es más fácil procesarlos que cuando están definidos en la vista frustrum (que es un espacio extraño, una pirámide truncada). Otra razón es que lleva todo tipo de transformación proyectiva que puedas imaginar en CG al mismo espacio (la cosa del cubo de la unidad). Entonces, independientemente de si usa una perspectiva o una proyección ortográfica, por ejemplo,
Aunque tal vez te enfocas demasiado en el por qué. El cubo de la unidad es realmente el resultado del proceso de las matemáticas involucradas o utilizadas para proyectar vértices en una pantalla y luego reasignar sus coordenadas al espacio ráster.
fuente