cubo - Objetos, mundo, cámara y espacios de proyección en OpenGL.
figuras 3d en opengl (1)
Estoy tratando de entender la creación de espacios en OpenGL:
Espacio objeto
Espacio mundial
Espacio de la cámara
Espacio de proyección
¿Mi entendimiento de estas etapas es correcto?
El "cubo" se está creando en el centro del sistema de coordenadas cartesianas, directamente dentro del programa escribiendo las coordenadas de los vértices.
Las coordenadas se transforman en coordenadas dentro del "mundo", lo que significa moverlo a cualquier lugar de la pantalla.
Bueno, en realidad me gustaría que compruebes mi comprensión de esos dos términos.
Ahora, estoy creando un triángulo en la pantalla negra. ¿Cómo encaja el código openGL en estos espacios?
Funciona en el indicador GL_MODELVIEW
de forma predeterminada, pero esa es la segunda etapa: el espacio mundial. ¿Significa eso que llamar a glVertex3f()
crea un triángulo en el espacio del objeto?
¿Dónde está la parte espacial mundial?
Además, he leído que los dos últimos espacios no forman parte de la canalización de openGL (o como se llame). Sin embargo, OpenGL contiene GL_PROJECTION
como GL_PROJECTION
, por ejemplo:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, w, h); // w - width, h - height
gluPerspective(45, ratio, 1, 100); // radio = w/h
glMatrixMode(GL_MODELVIEW);
¿Qué hace este código? Establece la perspectiva. ¿Crea el eje z? ¿Pero no es ya la parte del espacio objeto?
1) El espacio de objetos son los vértices del objeto en relación con el origen del objeto. En el caso de un cubo de 1x1x1, sus vértices serían:
( 0.5, 0.5, 0.5)
(-0.5, 0.5, 0.5)
( 0.5, -0.5, 0.5)
(-0.5, -0.5, 0.5)
etc.
2) El espacio del mundo es donde el objeto está en tu mundo. Si quieres que este cubo esté en (15, 10)
, crearías una matriz de traducción que, al multiplicarla con cada vértice, centraría tus vértices en torno a (15, 10)
. Por ejemplo, el primer vértice se convertiría en (15.5, 10.5, 0.5)
. La matriz para ir del objeto al espacio del mundo se denomina matriz "modelo".
3) El espacio ocular (a veces llamado espacio de la cámara) es el mundo relativo a la ubicación del espectador. Dado que esta tiene que ser una matriz por la cual cada vértice se multiplica, técnicamente es la inversa de la orientación de la cámara. Es decir, si desea una cámara en (0, 0, -10)
, su matriz de "vista" debe ser una traducción de (0, 0, 10)
. De esa manera, todos los objetos del mundo son 10 unidades hacia adelante, por lo que parece que estás 10 unidades hacia atrás.
4) El espacio de proyección es la forma en que aplicamos una perspectiva correcta a una escena (asumiendo que no está utilizando una proyección ortográfica). Esto casi siempre está representado por un frustum, y este artículo puede explicar eso mejor que yo. Esencialmente, estás mapeando espacio 3d en otro espacio sesgado.
OpenGL luego maneja el espacio de clip y el espacio de pantalla.
Funciona en el indicador
GL_MODELVIEW
de forma predeterminada, pero esa es la segunda etapa: el espacio mundial. ¿Significa eso que llamar aglVertex3f()
crea un triángulo en el espacio del objeto?
Usted establece vértices con glVertex3f()
en el espacio de objetos siempre . (esta es en realidad una forma muy antigua y lenta de hacerlo, pero ese no es realmente el punto de esta pregunta)
Cuando configura GL_MODELVIEW
, solo se cambia la matriz del modelo (que se puede manipular con glLoadMatrix
, glTranslate
, glRotate
, glScale
, etc.).
Línea por línea, su código está haciendo lo siguiente:
- Todas las transformaciones afectarán ahora a la matriz de proyección.
- Limpie la antigua matriz de proyección y reemplácela con la matriz de identidad.
- Usa toda la pantalla como el viewport.
- Establezca la matriz de proyección en una perspectiva con un campo de visión vertical de 45 grados con una relación de aspecto de w / h, alejando la unidad del plano de recorte cercano 1, y alejando la unidad del plano de recorte lejano a 100 unidades.
- Todas las transformaciones están afectando a la matriz de Modelview nuevamente.
El eje Z ya existe, esto solo establece la matriz de proyección que le da perspectiva, le dice a OpenGL que use toda la ventana para renderizar. Este no es el espacio de objetos, es la forma en que transformas el espacio de objetos en espacio de proyección.
También una nota al margen, estás usando OpenGL realmente muy antiguo (1992 antiguo). glTranslate, etc. fueron desaprobados hace mucho tiempo y ahora se han eliminado de la API. La única razón por la que todavía puede usarlos es porque los controladores los mantienen allí por motivos de compatibilidad. Recomiendo que estudies usando OpenGL moderno (3.0+). Las tuberías de gráficos modernos son varios órdenes de magnitud más rápido que el modo inmediato (glBegin, glVertex, glEnd).