2011-05-23 48 views
6

Quiero crear una proyección oblicua (cavalier) en OpenGL. Sé que esta operación no es compatible por defecto y en su lugar necesito una Shear Matrix y luego hacer una proyección ortogonal.opengl proyección oblicua

¿Puede decirme cuáles son los pasos/funciones de OpenGl que tengo que hacer?

Respuesta

13

no he utilizado una proyección oblicua/Cavalier antes, pero lo siguiente que debería dar una idea de cómo proceder:

Crear una matriz de 4x4 cizalla,

H(θ, Φ) = | 1, 0, -cot(θ), 0 | 
      | 0, 1, -cot(Φ), 0 | 
      | 0, 0, 1, 0 | 
      | 0, 0, 0, 1 | 

θ siendo el cortante en X, Φ siendo el cortante en Y, y Z solo.

(ref: slide 11 of http://www.cs.unm.edu/~angel/CS433/LECTURES/CS433_17.pdf)

que se multiplican por su proyección ortográfica,

| 2/(r-l),  0,  0, -(r+l)/(r-l) | 
| 0, 2/(t-b),  0, -(t+b)/(t-b) | 
| 0,  0, 2/(f-n), -(f+n)/(f-n) | 
| 0,  0,  0,   1  | 

(descrito por, izquierda, derecha, abajo, arriba, cerca y lejos)

(ref: http://en.wikipedia.org/wiki/Orthographic_projection_%28geometry%29)

OpenGL luego le permite cargar esta matriz directamente (como una matriz de 16 flotadores) a través de la función glLoadMatrixf():

GLfloat proj[16] = { ... }; 
glMatrixMode(GL_PROJECTION); // Make sure we're modifying the *projection* matrix 
glLoadMatrixf(proj);   // Load the projection 

Para un análisis más en profundidad la forma en la visualización y transformaciones trabajan en OpenGL, me refiero a Chapter 3 of the OpenGL "Red Book". Allí usan glOrtho() para crear y aplicar una proyección ortográfica.

Editar:

Como datenwolf señala, tener en cuenta que los elementos de matriz en OpenGL se especifican en la columna de orden mayor.

6

OpenGL le permite especificar matrices de proyección arbitrarias. Construir la matriz de proyección deseado usted mismo para mapear los vértices de entrada en el rango de -1 a 1 en cada dimensión, a continuación, cargarlo usando

GLfloat custrom_projection[16] = { 
    ... 
}; 
glMatrixMode(GL_PROJECTION); 
glLoadMatrix(custom_projection); 

índices OpenGL los elementos de matriz en colum importante pedido, es decir,

0 4 8 12 
1 5 9 13 
2 6 10 14 
3 7 11 15 
0

Dado que la proyección llamada oblicua se obtiene girando la proyección plana en un cierto ángulo lejos de la derecha, que no produce más que una imagen alargada a lo largo del eje de rotación, creo que basta con escalar la normal ortogonal proyección a lo largo de ese eje, por un factor de \csc\theta. Esta afirmación puede demostrarse mediante igualdad de trigonometría, por ejemplo, \sin\theta+\cos\theta \cot\theta=\csc\theta. Si su proyección oblicua está especificada por \theta y \phi como en la respuesta de Lucas, el ángulo del eje se puede calcular como un ejercicio de trigonometría basado en estos dos ángulos, por ejemplo, \arctan(\tan\theta\sqrt(1+\cot^2\phi)).

Cuestiones relacionadas