Pregunta

Recientemente he tenido algunos problemas de implementación de una función de zoom en una aplicación de pintura. Por favor, permítanme empezar por darle un poco de información de fondo.

En primer lugar, se ubicó modificando aplicación de demostración glPaint de Apple. Creo que es una gran fuente, ya que le muestra cómo configurar el EAGLView, etc ...

Ahora, lo que yo quería hacer a continuación, fue implementar la funcionalidad de zoom. Después de hacer algunas investigaciones, he intentado dos enfoques diferentes.

1) el uso glOrthof

2) cambiar el tamaño del marco de mi EAGLView.

Si bien en ambos sentidos me permiten zoom perfectamente de entrada / salida, experimento diferentes problemas, cuando en realidad viene a la pintura, mientras que el zoom.

Cuando uso (1), tengo para hacer que la vista como esta:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(left, right, bottom, top, -1.0f, 1.0f); //those values have been previously calculated
glDisable(GL_BLEND);
//I'm using Apple's Texture2D class here to render an image
[_textures[kTexture_MyImage] drawInRect:[self bounds]];
glEnable(GL_BLEND);
[self swapBuffers];

Ahora, asumamos que puedo ampliar un poco, luego pinto y después de eso, quiero alejar de nuevo. Con el fin de conseguir que esto funcione, necesito para asegurarse de que "kTexture_MyImage" siempre contiene los últimos cambios. Con el fin de hacer eso, necesito para capturar los contenidos de la pantalla después de que se han hecho cambios y los combino con la imagen original. El problema aquí es, que cuando el zoom, la pantalla sólo muestra parte de la imagen (ampliada) y no he encontrado una manera adecuada para hacer frente a esto todavía.

Me trató de calcular la cual fue ampliada parte de la pantalla, y luego hacer la captura. Después de eso me gustaría cambiar el tamaño de esta parte a su tamaño original y el uso otro método para pegarlo en la imagen original en la posición correcta.

Ahora, yo podría ir más en detalle sobre la forma en que he logrado esto, pero es muy complicado y pensé, tiene que haber una manera más fácil. Ya hay varias aplicaciones por ahí, que perfectamente hacer, lo que estoy tratando de lograr, por lo que debe ser posible.

En cuanto a enfoque (2) va, que puede evitar la mayoría de los anteriores, ya que sólo se cambia el tamaño de la ventana de mi EAGLView. Sin embargo, cuando la pintura, los trazos están muy lejos de su posición esperada. Probablemente hay más que tomar el nivel de zoom en cuenta la hora de pintar y volver a calcular los PuntosCg de una manera diferente.

Sin embargo, si usted ha hecho cosas similares en el pasado o me puede dar una pista, cómo podría aplicar el zoom en mi aplicación de pintura, lo agradecería mucho.

Gracias de antemano.

¿Fue útil?

Solución

Sí, es definitivamente posible.

Cuando se trata de pintar los programas, se debe mantener una lista enlazada o árbol de objetos para dibujar para una fácil inserción / extracción. Cuando el usuario deja de pintar, (es decir touchesEnded), se agrega objetos a la estructura de datos que contiene la escena.

Cuando los zooms de usuario que necesitan para modular las coordenadas de los objetos que está dibujando con respecto a las actuales transformaciones de vista, la proyección y modelview. En su caso, usted no está cambiando la ventana o la transformada modelview por lo que sólo se necesita una cuenta para la proyección transformar. También se podría implementar su zoom mediante traducción y la escala de la matriz modelview pero voy a ignorar ese caso, por razones de simplicidad, ya que implica la inversión de las transformadas.

La buena noticia es que usted está usando una proyección ortográfica lo que las coordenadas mundiales corresponden a las coordenadas de la ventana cuando no hay una función de zoom está en vigor. El "mundo" en su caso es un lienzo simple que corresponde probablemente al tamaño del dispositivo en coordenadas de la ventana.

Antes de añadir un objeto a la estructura de datos de la escena, convertir todas las coordenadas, mediante la proyección de transformación actual (es decir, los parámetros a la llamada glOrthof ()) a las coordenadas mundo (es decir, las coordenadas de la lona completo). Usted lo único que mantenerse sano si mantiene todas las cosas en su modelo en el mismo espacio de coordenadas.

Para convertir las coordenadas, asumiendo que nunca se puede alejar más allá de las dimensiones del dispositivo completo en su llamada glOrtho (), que tendrá que escalar hacia abajo proporcional a las proporciones de las dimensiones de su orto zoom a sus dimensiones orto unzoomed entonces el sesgo de ellas por la diferencia entre su parte inferior orto ampliada, los valores de la izquierda y los de los valores originales sin ampliar orto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top