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?
Respuestas:
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).
fuente
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).
fuente
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álm
sea 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 es0 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 porw
lo 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.
fuente
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.
fuente