todas tipos tecnico reglas proyecciones proyeccion ortograficas ortografica ortogonales ortogonal oblicua las globular generalidades elementos dibujo math opengl matrix orthographic projection-matrix

math - tecnico - tipos de proyecciones ortogonales



Proyección ortográfica con origen en la pantalla inferior izquierda (3)

Puede usar una matriz de proyección más general que además usa posiciones izquierda, derecha.

Ver Wikipedia para la definición.

Estoy usando las vinculaciones de OpenGL de python e intento utilizar solo las llamadas opengl modernas. Tengo una VBO con verticies, y estoy tratando de renderizar con una matriz de proyección ortográfica pasada al sombreador de vértices.

En este momento estoy calculando mi matriz de proyección con los siguientes valores:

from numpy import array w = float(width) h = float(height) n = 0.5 f = 3.0 matrix = array([ [2/w, 0, 0, 0], [ 0, 2/h, 0, 0], [ 0, 0, 1/(f-n), -n/(f-n)], [ 0, 0, 0, 1], ], ''f'') #later projectionUniform = glGetUniformLocation(shader, ''projectionMatrix'') glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, matrix)

Ese código que obtuve de aquí:

¿Fórmula para una matriz de proyección ortogonal?

Esto parece funcionar bien, pero me gustaría que mi origen esté en la esquina inferior izquierda de la pantalla. ¿Es esta una función que puedo aplicar sobre mi matriz para que todo "simplemente funcione", o debo traducir cada objeto por w / 2 h / 2 manualmente?

nota al margen: ¿Coincidirán las coordenadas las posiciones de los píxeles con esto funcionando correctamente?

Debido a que estoy usando técnicas OpenGL modernas, no creo que deba usar las llamadas gluOrtho2d o GL_PROJECTION.


glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, matrix)

Su matriz se almacena en orden mayor de fila. Entonces debe pasar GL_TRUE, o debe cambiar su matriz a column-major.


Todavía no estoy completamente familiarizado con las proyecciones, ya que recién comencé la programación de OpenGL, pero su matriz actual no traduce ningún punto. La diagonal aplicará la escala, pero la columna más a la derecha aplicará la traducción. El enlace que Dirk le dio le da una matriz de proyección que hará que su origen (0,0 es lo que quiere, ¿no?) La esquina inferior izquierda de su pantalla.

Una matriz que he usado para hacer esto (cada fila es en realidad una columna para OpenGL):

OrthoMat = mat4( vec4(2.0/(screenDim.s - left), 0.0, 0.0, 0.0), vec4(0.0, 2.0/(screenDim.t - bottom), 0.0, 0.0), vec4(0.0, 0.0, -1 * (2.0/(zFar - zNear)), 0.0), vec4(-1.0 * (screenDim.s + left)/(screenDim.s - left), -1.0 * (screenDim.t + bottom)/(screenDim.t - bottom), -1.0 * (zFar + zNear)/(zFar - zNear), 1.0) );

La pantallaDim matemática es efectivamente el ancho o la altura, ya que la izquierda y la parte inferior están configuradas en 0. zFar y zNear son 1 y -1, respectivamente (dado que es 2D, no son extremadamente importantes).

Esta matriz toma valores en píxeles, y las posiciones de los vértices también deben estar en píxeles. El punto (0, 32) siempre estará en la misma posición cuando cambie el tamaño de la pantalla también.

Espero que esto ayude.

Editar # 1: Para ser claros, los valores de izquierda / abajo / zfar / znear que indiqué son los que elegí para hacerlos. Puede cambiar estos cómo lo crea conveniente.