¿Cuál es el propósito del volumen de la vista canónica?

15

Actualmente estoy aprendiendo OpenGL y no he podido encontrar una respuesta a esta pregunta.

Después de aplicar la matriz de proyección al espacio de vista, el espacio de vista se "normaliza" de modo que todos los puntos se encuentren dentro del rango [-1, 1]. Esto generalmente se conoce como el "volumen de vista canónica" o "coordenadas de dispositivo normalizadas".

Si bien he encontrado muchos recursos que me dicen cómo sucede esto, no he visto nada sobre por qué sucede.

¿Cuál es el propósito de este paso?

breadjesus
fuente

Respuestas:

7

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? :)
Notabene
fuente
No veo ninguna parte en la que pregunte qué hace la matriz de proyección. Simplemente parece preguntarse para qué sirven las coordenadas normalizadas del dispositivo.
Chris dice que reinstala a Mónica el
La matriz de proyección define el tronco de la cámara. Pero esto no explica la razón para tener [-1,1] como el volumen de visualización canónico. ¿Por qué no tener [-100,100] en su lugar?
bobobobo
1
porque 1 es "número más común" que 100: D (0 es aún más común, pero el cubo 0x0x0 no es muy interesante ...)
Ivan Kuckir
5

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

Brian
fuente
Si bien es interesante, parece que sus puntos son parcialmente ciertos. No está utilizando una matriz homogénea, es solo que en el espacio del clip, los puntos se definen en el espacio homogéneo. 2) cierto, en el espacio del clip los ponts aún no se proyectan en la pantalla. Sucede después de la división de la perspectiva, aunque tenga en cuenta que esto necesariamente sucede cuando regresa del espacio de recorte al espacio cartesiano. 3) sí y no. La conversión de coordenadas de puntos al espacio NDC todavía es de alguna manera necesaria. Lo que no es necesario es el espacio de clip, que es específico de la GPU. ...
user18490
... Es la etapa de espacio de clip lo que no es necesario, no la reasignación al cubo de la unidad. Su última suposición tampoco es correcta. Se reasigna a -1 a 1 porque es más fácil pasar del espacio NDC al espacio ráster (la transformación de la ventana gráfica). En realidad, es aún más fácil si el espacio NDC está en el rango [0,1], que es el caso para alguna implementación. Al final, todo es matemática, así que seguro que se pueden usar otras convenciones. ver el buen sitio web scratchapixel para más detalles.
user18490
1

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.

Chemball masticable
fuente
No está en lo correcto cuando habla sobre detalles de hardware. No hay Además, si está escribiendo su propio rastarizator en cpu (¿por qué hacerlo? Para aprender cómo funciona esto :)), está utilizando las mismas matrices que en gpu. Tienes suerte de que yo todavía no tengo privileques a votar abajo :)
Notabene
¿No necesita saber la relación de aspecto? Por lo que entiendo, almacena los factores de escala para X e Y para que la imagen tenga la relación de aspecto correcta más adelante.
breadjesus
3
Corrígeme si me equivoco, pero él está hablando después de que proyectas puntos, y por lo tanto estamos hablando en 2D. Si este es el caso, OpenGL no sabe en qué parte de la pantalla está colocando esta imagen, ni cómo se va a mostrar. Crea una imagen que luego es fácil de escalar y colocar correctamente, pero no lo hace por usted. Estoy de acuerdo en que los detalles del hardware eran un mal nombre para eso, simplemente quise decir lo anterior. Además, puede especificar una matriz de proyección con una relación de aspecto, pero esa relación no tiene que ser la misma que la de su monitor.
Chewy Gumball
3
Tengo que decir que realmente disfruto esta conversación. Estás cerca de tener razón. Vamos a ir más profundo. No hay imagen después de los vértices de multiplacación por projMat. El resultado es un conjunto de puntos 2D con profundidad. Entonces comienza la rastarización y crea imágenes. (si en la CPU dibujaría líneas entre los triángulos y las verts y la rellenaría (y sombrearía lo que sea) ... en la GPU se realiza justo antes del sombreador de píxeles / fragmentos). Y la relación de aspecto coloca los puntos que deberían "reducirse" a valores mayores que 1 o menores que -1 y no se mostrarán.
Notabene
2
AHHH! Veo el problema aquí. Él dijo "Esto generalmente se conoce como el" volumen de vista canónica "o" coordenadas de dispositivo normalizadas ". Estaba respondiendo como si él estuviera preguntando sobre las coordenadas normalizadas del dispositivo, sin embargo, en realidad no estaba preguntando sobre esas coordenadas. De hecho, son dos cosas completamente diferentes y es por eso que estamos en desacuerdo aquí. Quizás eso debería aclararse para que las personas no cometan el mismo error que yo.
Chewy Gumball
1

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.

JasonD
fuente
Es cierto, poco edité mi respuesta para ser más claro sobre esto.
Notabene
Por cierto, un cubo unitario es un cubo del lado 1. Por lo tanto, el nombre no es apropiado. Debería llamarse volumen de visualización canónico.
user18490
1

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 > 1o x < -1entonces ese triángulo puede ser eliminado).

bobobobo
fuente
0

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.

usuario18490
fuente