¿Por qué el espacio de clip en OpenGL tiene 4 dimensiones?


13

Usaré esto como una referencia genérica, pero cuanto más navego en los documentos y libros en línea, menos entiendo sobre esto.

const float vertexPositions[] = {
    0.75f, 0.75f, 0.0f, 1.0f,
    0.75f, -0.75f, 0.0f, 1.0f,
    -0.75f, -0.75f, 0.0f, 1.0f,
};

En este libro en línea hay un ejemplo sobre cómo dibujar el primer y clásico hola mundo para OpenGL sobre cómo hacer un triángulo.

La estructura del vértice para el triángulo se declara como se indica en el código anterior.

El libro, como todas las otras fuentes sobre esto, enfatiza el punto de que Clip Space es una estructura 4D que se usa básicamente para decidir qué se rasterizará y se representará en la pantalla.

Aquí tengo mis preguntas:

  • No puedo imaginar algo en 4D, no creo que un humano pueda hacer eso, ¿qué es un 4D para este espacio Clip?
  • el documento más legible para el ser humano que he leído habla sobre una cámara, que es solo una abstracción sobre el concepto de recorte, y entiendo que, el problema es, ¿por qué no usar el concepto de cámara en primer lugar, que es más estructura 3D familiar? El único problema con el concepto de cámara es que necesita definir la perspectiva de otra manera y, por lo tanto, básicamente debe agregar otra declaración sobre qué tipo de cámara desea tener.
  • ¿Cómo se supone que debo leer esto 0.75f, 0.75f, 0.0f, 1.0f? Todo lo que obtengo es que todos son valores flotantes y entiendo el significado de los primeros 3 valores, ¿qué significa el último?

44
El Capítulo 4 explica exactamente lo que hace el cuarto componente. En realidad, rasca eso; El Capítulo 1 explica la transformación de clip a NDC en la sección de rasterización hasta la mitad .
Nicol Bolas

2
@NicolBolas el autor da su explicación en el primer capítulo y no pone ninguna referencia para los próximos capítulos, también pretende explicar lo que sucede después al comentar algún código de C ++ y el problema es que si no explica completamente todo en el capítulo 1 no tiene mucho sentido poner lo que se supone que debo saber en primer lugar en el capítulo número 4, especialmente si necesito estos conceptos para decodificar lo que está dentro del capítulo 1. Estoy leyendo esto ahora, y no solo 1 vez, ahora sé que se supone que debo buscar más la respuesta, repasaré los diversos capítulos.
user827992

1
No necesitas decodificar nada; dice en el capítulo 1: El componente W se divide en los otros 3 componentes. Esto también se indicó en la introducción. Lo que se pospone hasta el capítulo 4 es por qué OpenGL hace esto. Eso se retrasó hasta más tarde porque es irrelevante para la tarea en cuestión.
Nicol Bolas

3
Todavía sería información irrelevante para el problema en cuestión (es decir, representar un triángulo). Tienes curiosidad al respecto, pero no necesitas entender por qué es así entender que así es como funciona. Al aprender algo, el primer paso es comprender qué es. Una vez que comprenda lo que está sucediendo, puede tener lugar una discusión sobre por qué es así.
Nicol Bolas

1
Esta respuesta puede ayudar.
iammilind

Respuestas:


9

El término mágico es "coordenadas homogéneas" que se utilizan en sistemas donde la perspecive es un factor. Consulte el wiki para obtener una descripción general, pero es un largo curso de estudio comprenderlo realmente (lo cual no entiendo).


10

Lea la introducción de los libros que lee, se sorprenderá;)

http://arcsynthesis.org/gltut/Basics/Intro%20Graphics%20and%20Rendering.html en Descripción general de la rasterización

El valor "w" (donde los primeros 3 valores son x, y y z) básicamente dice cuáles son las dimensiones del espacio del clip. Debido a que este es un valor escalar, las 3 dimensiones del espacio del clip son iguales (y es por eso que el espacio del clip es un cubo). Cada vértice tiene su propio espacio de clip en el que existe (y básicamente necesita "encajar", de lo contrario CLIPS: D), no hay 1 "mundo" que sea el espacio de clip (aunque todos los espacios de clip están en el mismo " mundo "Creo que, incluso estoy teniendo problemas con esto; P).

Entonces, si su vértice tiene, por ejemplo, la coordenada [1,1,1], si el espacio del clip es 1, entonces el vértice está en la esquina superior derecha cerca de la pantalla (cuando todo está predeterminado, no sé si las direcciones puede ser alterado) Pero si el vértice tiene un espacio de recorte de 2, entonces la coordenada [1,1,1] estará en algún lugar, digamos, 3 cuartos a través de la pantalla a la derecha, 3 cuartos a través de la pantalla hacia arriba, y la tercera dimensión Puedes adivinar a ti mismo.

Creo que tener, digamos, un espacio de clip de 5 significaría que las ubicaciones dentro de ese espacio de clip varían de -5 a 5 en cada dimensión, en lugar de que el cubo sea 5x5x5. Pero eso es probablemente porque simplemente: todas las coordenadas xy y z están divididas por la dimensión del espacio del clip, por lo que básicamente sus vértices experimentan esto:

x = x / w

y = y / w

z = z / w

Y eso es lo que lo hace todo posible. Creo que la razón por la que esto existe es para facilitar las comparaciones. Si las coordenadas se han dividido por la dimensión del espacio del clip, entonces la coordenada que tiene 1 o más componentes con un valor superior a 1, existe fuera del espacio del clip. Entonces, si su espacio de recorte es, digamos 1024, pero la coordenada es [2000,3, -100], entonces el componente x (2000) está fuera del espacio de recorte (que solo varía de -1024 a 1024).

computacionalmente es fácil saber si algo está dentro del espacio de clips si todo lo que tiene que hacer es (poner muy groseramente ofc): (x / w) <1 && (x / w)> - 1 luego renderizar. Además, supongo que tener todos los espacios de clip de todos los vértices del mismo tamaño (por lo que cada cubo de espacio de clip que varía de -1 a 1 en cada dimensión) facilita todo lo que viene después del proceso de normalización, ya que desde ese momento en todas las coordenadas son flota entre 0 y 1 (sin tener en cuenta lo que se ha cortado).


La pregunta era por qué el espacio de clip es como es, no qué significa espacio de clip. Es decir, cuál es el punto de la división por W.
Nicol Bolas

2
Sin embargo, responde a la tercera pregunta de los 3 puntos de bala =)
dammkewl

8

TL; DR no es espacio 4D, es 3D más un número de escala que es prácticamente siempre 1. Si es 1, puede ignorarlo y los primeros tres números son x, y, z. Si no, se vuelve más complicado.

Aquí hay una explicación simple. Los vértices en 3D solo deben tener tres componentes

⌈x⌉ v = |y| ⌊z⌋

Si queremos manipularlos (por ejemplo, rotación, escala, etc.), usamos una matriz. El ejemplo más común, por supuesto, es la matriz Modelo-Vista-Proyección (MVP) que transforma las coordenadas mundiales en espacio de clip. Me gusta esto:

⌈m11 m12 m13⌉ ⌈x⌉ c = |m21 m22 m23| * |y| ⌊m31 m32 m33⌋ ⌊z⌋

Sin embargo, esto tiene un gran defecto: no puedes hacer la traducción. Si [x,y,z]es cero, no importa cuál msea ​​el resultado, siempre será cero, por lo que no podemos tener un MVP que incluya la traducción. Obviamente nos gustaría eso. La solución es agregar un 1 al final de nuestros vectores y expandir la matriz a 4x4:

⌈cx⌉ ⌈m11 m12 m13 tx⌉ ⌈x⌉ |cy| = |m21 m22 m23 ty| * |y| |cz| |m31 m32 m33 tz| |z| ⌊ 1⌋ ⌊ 0 0 0 1⌋ ⌊1⌋

(Si observa cualquier matriz de MVP ortogonal, por ejemplo, de glOrtho(), encontrará que la cuarta fila es 0 0 0 1. A veces incluso se deja implícita). Si trabaja con las matemáticas, verá que es lo mismo que

⌈cx⌉ ⌈m11 m12 m13⌉ ⌈x⌉ ⌈tx⌉ |cy| = |m21 m22 m23| * |y| + |ty| ⌊cz⌋ ⌊m31 m32 m33⌋ ⌊z⌋ ⌊tz⌋

Se llama el cuarto componente w, y aunque no tiene que ser 1, casi siempre lo es ( antes de una transformación de todos modos; después, generalmente se vuelve a homogeneizar dividiendo el vector completo por wlo que es 1 nuevamente). Es una especie de truco permitir que las matrices de transformación incluyan traducción.

Editar

Creo que la motivación original era para las proyecciones en perspectiva , que son imposibles con las coordenadas 3D. Hay otras transformaciones que solo puedes hacer con vectores 4D, pero la traducción es la más fácil de entender.


2
Explica tus votos negativos.
Timmmm

+1, suponiendo que la información es correcta, esta fue una buena explicación y fue útil para mí. gracias
Luke

1

También hay una razón más que veo y que no se mencionó en las respuestas anteriores.

Las matrices de traducción son 4x4 para que también pueda traducir el objeto alrededor del "mundo". Porque con una matriz 3x3 puede rotar y escalar una coordenada 3d, pero puede traducir una coordenada 3d solo con una matriz 4x4, de aquí la necesidad de expresar las coordenadas 3d en un vector 4d.


solo "necesita" un vector 4d bajo tales definiciones. una matriz 4x4 no es solo con el solo propósito de agregar como a todos les gusta asumir y reclamar a los demás. si todo lo que quisieras es agregar traslación después de la rotación (a un punto 3d) simplemente definirías una matriz 4x3. es mucho más eficiente si eso es todo lo que buscas. no tiene que limitarse a las reglas que se hicieron por un conjunto completo de otras razones solo porque se ve más ordenado. lol
Charco
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.