UI: SDL o GTKMM?
Posted by and2arana on 2008-10-22 04:19
Estuve investigando un poco el widget este del que hablaron los chicos del otro grupo, el GTKGL La única ventaja que ofrece es la posibilidad de usar OpenGL para dibujar sobre la superficie del mismo. Fuera de esto, funciona exactamente igual que el "DrawingArea" que viene de stock, incluyendo el comportamiento del timeout que estabamos queriendo evitar usando SDL.
Teniendo en cuenta esto, y que además Cairo (el API de "bajo nivel" que expone GTKmm para dibujar sobre "DrawingArea") posee funcionalidad de rotaciones, translaciones, etc... me parece que le pongo un poroto a usar GTKmm directamente como engine gráfico.
Teniendo en cuenta esto, y que además Cairo (el API de "bajo nivel" que expone GTKmm para dibujar sobre "DrawingArea") posee funcionalidad de rotaciones, translaciones, etc... me parece que le pongo un poroto a usar GTKmm directamente como engine gráfico.
Home / Developer API / Tour / Get a Project - Solutions for Bug & Issue Tracking, Collaboration Tools, Subversion Hosting, Git Hosting
Taller i is powered by Assembla.
2 Comments
By graineri on 2008-10-22 12:31
Acá agrego un post más que puede servir a la causa.
> Mariano podrías explicar un poco la inicialización de la matriz de
> proyección?
> glMatrixMode(GL_PROJECTION);
> double ar = static_cast<double>(w) / h;
> glOrtho(-ar, ar, -1.0, 1.0, -1.0, 1.0);
No es mi idea explayarme mucho sobre las matrices de transformación
(pueden ver más en [1]), la idea básica es que las coordenadas que
ustedes utilizan al dibujar son "coordenadas objeto" a las que se les
aplican las siguientes transformaciones:
- ModelView: coordenadas objeto -> coordenadas "punto de vista"
- Projection [2]: coordenadas "punto de vista" -> NDC (coordenadas normalizadas)
- Viewport: NDC -> coordenadas de ventana
Por defecto las transformaciones ModelView y Projection son la
identidad y la "transformación del viewport" lleva el punto (-1, -1)
al (0, 0) y el (1, 1) al (w, h) (en OpenGL las coordenadas X crecen
hacia la derecha y las Y hacia arriba ). Pero eso tiene el
inconveniente de que si dibujan un cuadrado en sus coordenadas objeto
les aparecería deformado. Lo que hace 'glOrtho(-ar, ar, -1.0, 1.0,
-1.0, 1.0);' [3] en este caso es modificar la matriz de proyección
para que los dibujos que realicen no aparezcan "estirados".
> Como puedo hacer para convertir la posición del mouse (sería la
> transformación inversa)?
Podés hacerlo sabiendo que la esquina inferior izquierda de la ventana
corresponde a las coordenadas objeto (-ar, -1) y la superior derecha a
(ar, 1) o utilizando gluUnproject() [4]. Creo que la primera opción es
la más simple.
> Aparte es posible aprovechar las funciones de cálculos de matrices de Opengl
> de forma externa? Por ejemplo para calcular rotaciones.
Es posible, pero no es ni recomendable ni eficiente. Siendo gráficos
2D, hacer una matriz de rotación es simple [5] y seguramente les
resulte más sencillo que intentar aprovechar el stack de matrices de
OpenGL para hacer transformaciones arbitrarias.
Saludos.
[1] http://www.opengl.org/resources/faq/technical/transformations.htm
[2] Más una división extra por una coordenada extra que no viene al caso.
[3] http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/...
[4] http://www.opengl.org/resources/faq/technical/glu.htm (4.070)
[5] http://en.wikipedia.org/wiki/Rotation_matrix#The_2-dimensional_rotati...
By and2arana on 2008-10-22 16:28
OpenGL es una librería para renderizar objetos de un espacio 3D en superficies bidimensionales. Por lo tanto, entre las muchas cosas que hace, tiene que trasformar objetos tridimensionales de complejidad arbitraria a su representación bidimensional. Para hacer eso, encadena una serie de transformaciones lineales que convierte las coordenadas de los vertices de los objetos en el mundo 3D a coordenadas en bidimensionales. Otro proceso que se llama raster agarra esas coordenadas bidimensionales y las convierte en los pixeles que se ven en pantalla. Estos procesos (y algunos más) se encadenan en un pipeline que es relativamente configurable.
Ahora, hablé de una serie de transformaciones lineales. No me acuerdo el orden en el que se aplican ni la cantidad exacta de transformaciones, pero básicamente hay una transformación que genera coordenadas tridimensionales relativas a un sistema de posicionamiento absoluto predefinido, otra que genera coordenadas relativas a la posición de la camara en función de las coordenadas de este sistema absoluto y hay una que proyecta los puntos 3D a la superficie 2D. Como toda transformación lineal, existe una matriz de transformación cuya multiplicación por los vectores del espacio vectorial es equivalente a aplicar la transformación asociada, así que en realidad lo que se tienen son matrices de transformación. La "matriz de proyección" es una de esas matrices (de hecho, es la última que enumeré hace un par de oraciones).
Estas matrices se generan como composición de transformaciones más simples. O sea... se multiplican matrices (que es equivalente a componer transformaciones lineales) y se almacenan los resultados. Por ejemplo, OpenGL tiene matrices predefinidas de rotación, escalado y translación (si, translación... para el que se acuerde algo de algebra II la translación no es una transformación lineal... lo que significa que no tiene matriz asociada, y eso es un problema. Para resolverlo, en realidad se trabaja sobre un espacio 4D en donde la translación SI es una transformación lineal... pero no me quiero ir de tema).
Sin ánimo de extenderme mucho más, lo que se hace es seleccionar con una función de OpenGL una matriz activa, y luego se llaman a funciones que concatenan sobre esta matriz activa las transformaciones básicas. Todas estas matrices se apilan en un stack interno en el que se pueden almacenar y recuperar... pero eso ya es otro tema y esto que pretendía ser una introducción ya se puso bastante largo.