Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Poligonos "out Of Screen"

Iniciado por ALRAZ, 25 de Marzo de 2005, 12:16:33 AM

« anterior - próximo »

ALRAZ

 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í)

[EX3]

 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...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

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)  

Lord Trancos 2

 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
   ....



on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

Lord Trancos 2

 
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).
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

ALRAZ

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:

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.

ALRAZ

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?

zupervaca

 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

Lord Trancos 2

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.
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

Lord Trancos 2

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:  
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

zupervaca

 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...






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.