La Red de Conocimientos Pedagógicos - Currículum vitae - Transformación de perspectiva OpenGLES y coordenadas UV de pantalla

Transformación de perspectiva OpenGLES y coordenadas UV de pantalla

1. Comience con los requisitos

Cuando estaba haciendo pegatinas 3D, me encontré con ese requisito: las pegatinas 3D debían mezclarse con imágenes. Para crear un efecto 3D de distancia pequeña y grande, es necesario dibujar pegatinas bidimensionales en la pantalla mediante transformación de perspectiva. Si desea agregar un efecto de fusión, debe conocer las coordenadas transformadas. dará como resultado pegatinas mezcladas. Dibujar en la pantalla puede causar confusión y superposición, por lo que calcular las coordenadas precisas de las partes superpuestas es la clave para lograr la combinación. Con este fin, retome el conocimiento matemático olvidado y vuelva a derivar el proceso de transformación de perspectiva para comprender mejor la transformación de perspectiva y cómo convertirla a las coordenadas espaciales de la pantalla.

2. Derivación de la transformación de perspectiva

1. Fórmula de proyección en perspectiva

La siguiente figura muestra la proyección general de un punto espacial (x, y, z) La ruta proyectada del punto de referencia (xv, yv, zv). La línea de proyección intersecta el plano de observación en la posición de coordenadas (xp, yp, zvp), donde zvp es el punto seleccionado en el plano de observación ubicado en el eje z.

A partir de esto podemos calcular la ecuación paramétrica de la posición de coordenadas de la siguiente manera:

Cuando el punto de referencia de la proyección está en el eje Z, xv = yv = 0, en este momento:

Por lo tanto, podemos construir una matriz de transformación para convertir una posición espacial en una posición de coordenadas homogénea, de modo que la matriz solo contenga parámetros de perspectiva y no valores de coordenadas. Luego, la transformación de proyección en perspectiva del sistema de coordenadas de observación se implementa en dos pasos. Primero use la matriz de transformación de perspectiva para calcular las coordenadas homogéneas:

Ph es la representación matricial de columnas del punto homogéneo (xh, yh, zh, h) y P es la coordenada (x, y, z). , 1) Representación de matriz de columnas. En la práctica, la matriz de perspectiva debe fusionarse con la matriz de observación (ViewMatrix), y luego la matriz combinada se aplica a la descripción de coordenadas mundiales de la escena para generar coordenadas homogéneas.

Para evitar la distorsión después de dividir el eje z por el parámetro homogéneo h, necesitamos normalizar las coordenadas de la proyección en perspectiva zp estableciendo elementos de matriz para la transformación z. Hay varias formas de seleccionar elementos matriciales. La siguiente es una forma posible de formar una matriz de proyección en perspectiva:

5. Vista frustum simétrica

La línea desde el punto de referencia de la proyección hasta el centro de la ventana de recorte que pasa por la El volumen de observación dirá la línea central del prisma de proyección en perspectiva. La línea central del prisma se cruza con el plano de observación en la posición de las coordenadas (xv, yv, zvp) y el tamaño de la ventana se usa para representar la posición diagonal de la ventana de recorte, que se puede obtener:

La imagen general se muestra a continuación:

Se puede obtener la altura de la ventana de recorte:

6. Prisma de proyección en perspectiva oblicua

Si la línea central del cuerpo de observación de proyección en perspectiva no es perpendicular al plano de observación, se obtendrá un prisma oblicuo Taiwán (truncado oblicuo).

Para facilitar el cálculo, se puede obtener el punto de referencia de la proyección (xv, yv, zv) = (0, 0, 0) y se pueden obtener los elementos de la matriz de transformación errónea:

Si observamos Si el plano se coloca cerca del plano de recorte, la matriz de proyección en perspectiva se puede simplificar aún más. Mueva el centro de la ventana de recorte a la posición de coordenadas del plano de observación (0, 0). El valor del parámetro de corte incorrecto que debe seleccionarse satisface:

Cuando el punto de referencia de la proyección está ubicado en el origen de la observación. coordina y está cerca del plano de recorte y del plano de observación. La matriz de proyección en perspectiva se puede simplificar como:

Al combinar la matriz de perspectiva y la matriz de corte transversal, puede obtener la siguiente matriz de proyección en perspectiva oblicua que convierte la posición de las coordenadas de la escena en coordenadas ortogonales homogéneas. El punto de referencia de proyección de esta transformación es el origen de las coordenadas de visualización y el plano de recorte cercano es el plano de visualización.

7. Coordenadas de transformación de proyección en perspectiva normalizadas

La matriz transforma la posición diagonal en el sistema de coordenadas de observación en coordenadas homogéneas de proyección en perspectiva. Las coordenadas de proyección ortogonales reales se pueden obtener dividiendo las coordenadas homogéneas utilizando el parámetro homogéneo h.

Esta proyección en perspectiva transforma todos los puntos en el volumen de observación del prisma en posiciones en el volumen de observación de la tubería paralela rectangular. El último paso del proceso de transformación es mapear la tubería paralela en el volumen de vista normalizado, que en realidad son las coordenadas estandarizadas del dispositivo. Coordenadas en el sistema (NDC).

El proceso de conversión sigue el proceso de normalización de la proyección de reseñas. Un tubo paralelo rectangular transformado a partir de un observador de prisma se mapea en un cubo normalizado de un sistema de referencia simétrico a la izquierda. La matriz de escala normalizada es:

La matriz de perspectiva y la matriz de escala se combinan para obtener la matriz normalizada:

Al generalizar la matriz de perspectiva normalizada, se puede obtener la siguiente forma:

Si el volumen de observación de la proyección en perspectiva se especifica inicialmente como un prisma simétrico, el ángulo de campo y el tamaño de la ventana de recorte se pueden usar para expresar los elementos de la transformación de perspectiva normalizada. Cuando el punto de referencia de la proyección está ubicado en el origen y el plano de observación está cerca del plano de recorte, podemos obtener:

3. Función de observación tridimensional de Android OpenGLES

1. Función de transformación de observación

En Android, puede utilizar el método Matrix.setLookAtM para configurar la matriz de transformación de observación. El prototipo del método es el siguiente:

El método en OpenGL es diferente del. OpenGLES en Android. El modo de observación del modelado OpenGL se establece con la siguiente declaración:

Los parámetros de observación se especifican con la función GLU, que es la siguiente:

Entre ellos (x0, y0, z0) es el mismo que en Android Los puntos (eyeX, eyeY, eyeZ) del método setLookAtM representan la posición del punto de referencia de observación en el sistema de coordenadas mundial. Mientras que (xref, yref, zref) y (centerX, centerY, centerZ) representan las coordenadas del punto de referencia, (Vx, Vy, Vz) y (upX, upY, upZ) representan el vector ascendente. Por defecto, los parámetros de gluLookAt son P0 = (0, 0, 0), Pref = (0, 0, -1), V = (0, 1, 0);

2. Perspectiva simétrica prisma de proyección

El volumen de observación del prisma de proyección en perspectiva simétrica en OpenGL está representado por gluPerspective, y el prototipo es el siguiente:

También existe un método similar en OpenGLES de Android:

Entre ellos, theta y fovy representan el ángulo del campo de visión, que es opcional de 0 a 180 grados. aspecto representa la relación de aspecto. lejos y cerca representan la distancia desde el punto de referencia de observación hasta los planos de recorte lejos y cerca.

3. Función de proyección en perspectiva universal

En OpenGL, el prisma universal generalmente se implementa usando la función glFrustum:

Cuando xwmin = - xwmax y ywmin = son seleccionado: ywmax representa un prisma simétrico.

En OpenGLES de Android, se puede utilizar un método similar:

4. Cálculo de coordenadas UV cuando las coordenadas espaciales se proyectan en el plano de observación.

Bien, hasta ahora, hemos discutido todo el proceso de transformación de la matriz de proyección en perspectiva, así como los métodos para configurar la matriz de proyección en OpenGL y OpenGLES. Entonces, ¿cómo obtener las coordenadas UV de la pantalla después de que la matriz de proyección en perspectiva transforma las coordenadas espaciales?

Supongamos que las coordenadas de un punto en el tronco son (x, y, z), y las coordenadas después de la transformación de proyección son (x', y', z').

Entonces podemos obtener la siguiente fórmula de cálculo:

Las coordenadas recién obtenidas (x', y', z', w) son las coordenadas después de la transformación de la proyección en perspectiva, que son la proyección en perspectiva normalizada en la sección anterior. 7 Coordenadas homogéneas proyectadas en perspectiva discutidas en Coordenadas transformadas. Dado que el plano de observación de OpenGL es el plano de recorte cercano, las coordenadas son las coordenadas tridimensionales de las coordenadas (x, y, z) en el plano de recorte cercano después de la transformación de perspectiva. Entre ellos, w registra la información de profundidad. Cuando se establece en proyección de prisma simétrico, el valor real de la matriz es la matriz de proyección en perspectiva normalizada del prisma simétrico calculada previamente:

Entonces, las nuevas coordenadas obtenidas por conversión son coordenadas homogéneas proyectadas, entonces, ¿qué sucede a continuación? ¿Convertir a coordenadas UV de pantalla? Solo necesitamos normalizar las nuevas coordenadas obtenidas al sistema de coordenadas NDC y luego convertirlas a la forma de expresión de coordenadas UV.

1. Convertir al sistema de coordenadas NDC

Aquí, divida todas las coordenadas por el valor w para obtener las coordenadas NDC. En este momento, w se normalizará a -1 ~ 1 entre. .

2. Convertir a coordenadas UV de pantalla

Con base en las coordenadas NDC calculadas previamente, se puede convertir a coordenadas UV de pantalla. Porque el rango de coordenadas NDC es un cubo de -1 a 1, mientras que las coordenadas UV de la pantalla son un plano de 0 a 1. ¿Cómo calcular? De hecho, es muy simple. Solo necesita alejarse de las coordenadas NDC al general original y luego traducir al centro de la pantalla UV (0.5, 0.5) para obtener las coordenadas UV.

5. Calcula la transformación de perspectiva a coordenadas uv en el plano de recorte en OpenGLES.

Muchas personas pueden marearse después de ver muchos cálculos delante. De hecho, no es necesario comprender el proceso de derivación anterior en absoluto. Las coordenadas uv de la pantalla después de la transformación de la matriz de proyección en perspectiva en OpenGL y OpenGLES son incluso una cuestión muy simple. El proceso de transformación es el siguiente:

Al convertir el prisma. El producto de las coordenadas en (frustum) y la transformación total mvpMatrix da como resultado una variable vec4, que es el valor de gl_Position. gl_Position representa la posición espacial total transformada. Esto es lo que llamamos coordenadas homogéneas. Luego conviértalo en coordenadas NDC y reconstruya una nueva coordenada UV de pantalla.

6. Finalmente, hablemos de la idea de realizar los requisitos de las pegatinas 3D.

El proceso general para realizar pegatinas 3D y mezclar pegatinas e imágenes de forma personalizada es el siguiente:

1. Calcule las coordenadas de la cara frontal en función de las coordenadas de los puntos clave de la cara (teniendo en cuenta la inclinación de la cabeza y el giro de la cara, si los puntos clave detectados en la cara son espacios tridimensionales puntos, se realizarán cálculos adicionales)

2. Calcule las coordenadas UV de la pegatina en los cuatro vértices del espacio de la pantalla en función de las coordenadas de la cara frontal

3. Basado en las coordenadas UV calculadas de la pegatina en el espacio de la pantalla, vuelva a calcular las coordenadas espaciales del plano donde realmente se encuentra la pegatina (asumiendo las coordenadas cuando no se realizan movimientos como inclinar la cabeza)

4 De acuerdo con las coordenadas obtenidas del espacio real de la pegatina, después de la traslación y rotación, calcule la matriz integral después de la transformación de proyección.

5. Calcule la posición final total en glsl:

6. Pase la coordenada espacial final vPosition al Fagment Shader y convierta las coordenadas en las coordenadas uv de la pantalla

p>

7. Mezcla la textura de la parte superpuesta de la imagen y la pegatina