Solución:
No entiendes lo que está diciendo. M
es una matriz. Por tanto, M • F también es una matriz. Construye una matriz de perspectiva. Consulte este artículo para obtener una explicación de cómo está construido y cuándo desea utilizarlo. glFrustum()
vs. gluPerspective()
:
glFrustum () y gluPerspective () ambos producen matrices de proyección en perspectiva que puede usar para transformar del espacio de coordenadas del ojo al espacio de coordenadas del clip. La principal diferencia entre los dos es que glFrustum () es más general y permite proyecciones fuera del eje, mientras que gluPerspective () solo produce proyecciones simétricas (en el eje). De hecho, puede usar glFrustum () para implementar gluPerspective ().
Los planos de recorte son planos que recortan secciones del mundo para que no tengan que renderizarse. El frustum describe dónde están los aviones en el espacio. Sus lados definen el volumen de la vista.
glFrustum
genera una matriz de proyección en perspectiva.
Esta matriz asigna una parte del espacio (el “tronco”) a su pantalla. Se aplican muchas advertencias (coordenadas de dispositivo normalizadas, división de perspectiva, etc.), pero esa es la idea.
La parte que te desconcierta es una reliquia de la API OpenGL obsoleta. Puede ignorarlo con seguridad, porque generalmente aplica gluFrustum()
en una matriz de proyección de identidad, por lo que la multiplicación mencionada en el documento no tiene ningún efecto.
Una forma quizás más comprensible de hacer las cosas es la siguiente:
// Projection matrix : 45° Field of View, 4:3 ratio, display range : 0.1 unit <-> 100 units
glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);
// Or, for an ortho camera :
//glm::mat4 Projection = glm::ortho(-10.0f,10.0f,-10.0f,10.0f,0.0f,100.0f); // In world coordinates
// Camera matrix
glm::mat4 View = glm::lookAt(
glm::vec3(4,3,3), // Camera is at (4,3,3), in World Space
glm::vec3(0,0,0), // and looks at the origin
glm::vec3(0,1,0) // Head is up (set to 0,-1,0 to look upside-down)
);
// Model matrix : an identity matrix (model will be at the origin)
glm::mat4 Model = glm::mat4(1.0f);
// Our ModelViewProjection : multiplication of our 3 matrices
glm::mat4 MVP = Projection * View * Model; // Remember, matrix multiplication is the other way around
Aquí, usé glm::perspective
(el equivalente de gluPerspective ()), pero también puede usar gluFrustum.
En cuanto a los argumentos de la función, se explican mejor en esta parte del documento:
left bottom – nearVal y right top – nearVal especifican los puntos en el plano de recorte cercano que se asignan a las esquinas inferior izquierda y superior derecha de la ventana, asumiendo que el ojo está ubicado en (0, 0, 0)
Si no está familiarizado con las matrices de transformación, escribí un tutorial aquí; la sección “Matriz de proyección” debería ayudarlo especialmente.