Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: ALRAZ en 25 de Marzo de 2005, 12:16:33 AM

Título: Poligonos "out Of Screen"
Publicado por: ALRAZ en 25 de Marzo de 2005, 12:16:33 AM
 Wenas  (ole)

Estoy haciendo algunas cosillas con OpenGL para dibujar sprites 2D.
Tengo lo siguiente:

-Posición X, Y del srpite
-Textura (mapa de bits) para el sprite
-Alto y Ancho de la textura
-Ángulo de rotación

y tengo una función que me dibuja un sprite en la pantalla en base a esa información (Utilizando GL_QUADS).
Y cuando dibujo uno, todo corre mu xulo... el problema es cuando estoy dibujando 2000 o 3000 objetos en un frame... Se pone leeeeentoooo

Me he dado cuenta que el hecho de dibujar algunos Sprites que estarán fuera de la pantalla afecta el rendimiento.
Y dado que no todos los objetos están dentro de la pantalla, quería preguntar:

Cómo hago para detectar cuando las 4 esquinas de un cuadrado están fuera de la pantalla?
(Tengamos en cuenta que el ángulo en el que es dibujado el sprite influye mucho aquí)
Título: Poligonos "out Of Screen"
Publicado por: [EX3] en 25 de Marzo de 2005, 01:51:33 AM
 No se, asi a bote pronto se me ocurre que podrias usar colision por cajas y comprobar si el sprite colisiona con la caja que define a la pantalla, por ejemplo:

Type RECT
   Left As Long
   Top As Long
   Right As Long
   Bottom As Long
End Type

Dim Screen As RECT, Sprite As RECT

'Resolucion de pantalla a 640x480:
Screen.Left = 0
Screen.Top = 0
Screen.Right = 640
Screen.Bottom = 480

'Sprite de 64x64 en la posicion 10x 100y:
Sprite.Left = 10
Sprite.Top = 100
Sprite.Right = 74
Sprite.Bottom = 164

En este caso la colision entre Screen y Sprite existiria, con lo cual se dibujaria el sprite.

'Sprite de 64x64 en la posicion -100x -100y:
Sprite.Left = -100
Sprite.Top = -100
Sprite.Right = -36
Sprite.Bottom = -36

En este caso la colision no existiria y por lo tanto no se dibujaria el sprite.

Es una forma sencilla aunque las hay mas optimas creo yo. El problema que veo es que este metodo puede que no te sirva para cuando dibujes aplicando angulos, tal vez en vez de usar Rectangulos tal vez te sirvan Regiones, mira el tema de Regiones en el API de Windows, sempre y cuando no vayas hacer tu aplicacion multiplataforma, claro.

Salu2...
Título: Poligonos "out Of Screen"
Publicado por: ALRAZ en 25 de Marzo de 2005, 02:14:51 AM
 gracias, gracias

ahora que comentas eso, recuerdo que en NeHe hay un tutorial sobre colisión de polígonos  (ole)

Le hecharé un ojo a ver si aprendo algo  (genial)  
Título: Poligonos "out Of Screen"
Publicado por: Lord Trancos 2 en 25 de Marzo de 2005, 02:17:57 AM
 Si esos X000 sprites son un mapa de tiles; deberias de modificar la funciona que dibuja el mapa de tiles para que no haga un:


 for y = 0 to mapatiles.alto - 1 do
   for x = 0 to mapatiles.ancho - 1 do
   ....



Título: Poligonos "out Of Screen"
Publicado por: Lord Trancos 2 en 25 de Marzo de 2005, 02:26:28 AM
 
Cita de: "ALRAZ"gracias, gracias

ahora que comentas eso, recuerdo que en NeHe hay un tutorial sobre colisión de polígonos  (ole)

Le hecharé un ojo a ver si aprendo algo  (genial)
Ufff.... no creo que te interese eso...

A ti, tal y como dice ex3, lo que te interesa es una funcion que te diga si dos rectangulos intersectan (¿se dice asi?).

Ejemplo de funcion en pascal:


function RectCollision(var _r1, _r2: TRect): boolean;

begin
Result := not ((_r1.Right  < _r2.Left) or (_r1.Bottom < _r2.Top) or
              (_r2.Right  < _r1.Left) or (_r2.Bottom < _r1.Top));
end;


Basicamente lo que hace la funcion es comprobar si una caja se encuentra arriba, a la izquierda, a la derecha, o abajo de la otra. Si se cumple esa condicion, no hay colision (de ahi el "not" para que la funcion devuelva true si hay colision).
Título: Poligonos "out Of Screen"
Publicado por: ALRAZ en 25 de Marzo de 2005, 02:31:06 AM
Cita de: "Lord Trancos 2"
Basicamente lo que hace la funcion es comprobar si una caja se encuentra arriba, a la izquierda, a la derecha, o abajo de la otra. Si se cumple esa condicion, no hay colision (de ahi el "not" para que la funcion devuelva true si hay colision).
Pero recuerda que los rectángulos pueden rotar en algún ángulo determinado.

Respecto a lo del mapa de tiles:
No, no es para eso. Simplemente estoy haciendo pruenas de rendimiento y me di cuenta que dibujar los gráficos que no están en pantalla consumen recursos a pesar de que no se ven  :angry:
Título: Poligonos "out Of Screen"
Publicado por: AgeR en 25 de Marzo de 2005, 02:36:52 AM
 Una forma rápida de comprobarlo es usando el radio de la circunferencia que envuelve al cuadrado (siempre que sea un cuadrado, claro XD). Por mucho que gire el cuadrado, siempre tiene el mismo radio.
Título: Poligonos "out Of Screen"
Publicado por: ALRAZ en 25 de Marzo de 2005, 04:07:22 AM
Cita de: "AgeR"Una forma rápida de comprobarlo es usando el radio de la circunferencia que envuelve al cuadrado (siempre que sea un cuadrado, claro XD). Por mucho que gire el cuadrado, siempre tiene el mismo radio.
Esa me parece una idea excelente  :lol:

Ahora sólo tengo un problema...

Cómo hago para saber "dónde estoy"? (nooo)
Es decir, preguntar a opengl las coordenadas X, Y y Z actuales

intenté con un glGet pasando GL_CURRENT_RASTER_POSITION, pero me regresa puros ceros  O_O
imagino que no es lo que estoy buscando  :P

sugerencias?
Título: Poligonos "out Of Screen"
Publicado por: zupervaca en 25 de Marzo de 2005, 08:16:04 AM
 para saber si un cuadrado rotado esta dentro de unas coordenadas de otro cuadrado no rotado debes de rotar las cuatro esquinas del cuadrado y comprobarlas
Título: Poligonos "out Of Screen"
Publicado por: Lord Trancos 2 en 25 de Marzo de 2005, 10:10:24 AM
Cita de: "ALRAZ"Pero recuerda que los rectángulos pueden rotar en algún ángulo determinado.
Bueno, siempre puedes calcular el "bounding box" de cada sprite en cada frame.

Aunque para eso tendras que transformar manualmente los vertices.
Título: Poligonos "out Of Screen"
Publicado por: Lord Trancos 2 en 25 de Marzo de 2005, 10:12:24 AM
Cita de: "ALRAZ"Cómo hago para saber "dónde estoy"? (nooo)
Es decir, preguntar a opengl las coordenadas X, Y y Z actuales

Ein?  :huh:  
Título: Poligonos "out Of Screen"
Publicado por: zupervaca en 25 de Marzo de 2005, 10:33:26 AM
 si vas a utilizar sprites 2d puedes olvidarte de las transformaciones de matrices de opengl y usar directamente las funciones de dibujado, si es eso lo que quiere saber...