Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Juego 2.5D usando OpenGL

Iniciado por PIM, 07 de Diciembre de 2016, 09:59:24 PM

« anterior - próximo »

PIM

Hola de nuevos amigos de esta estupenda web. Me preguntaba si ustedes saben alguna o algunas técnicas para realizar este tipo de juegos. He leido algo sobre ello, pero casi siempre hacen alusión a juegos de tipo isométricos. Lo que en realidad busco es hacer juegos más acercados a esto:



o esto:



En donde los escenarios parecen estar en perspectiva 3D, pero los personajes parece que están limitados a una proyección 2D.

Ojalá me puedan ayudar.

Muchas gracias de antemano.
;)

[EX3]

Un 2.5D suele ser un juego 3D con la cámara puesta en perspectiva y visualizando la escena en lateral (aunque la gracia de los 2.5D es poder jugar con distintos ángulos de cámara, como en Shadow Complex por ejemplo), más allá de eso no tiene mucha más miga que hacer un juego 3D cualquiera. Simplemente la lógica de movimiento de los personajes la haces sobre un eje para moverse solo de izquierda a derecha, como un plataformas 2D de toda la vida.

En motores como Unity3D o Unreal Engine es fácil hacer juegos de este estilo. Sin ir más lejos uno en el que estoy trabajando en Unity3D:



En resumen, sea en OpenGL o con lo que lo quieras hacer, hacer un juego 2.5D vendría a requerir lo mismo que un juego 3D común y corriente.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

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

PIM

#2
Bueno, primero que nada te agradezco mucho el tiempo que dedicaste a responder mi pregunta. Lo segundo; no creo que solo aplique eso que comentas. Algo que he notado cuando usan esta técnica, es que parece que la posición en la que se encuentre el o los personajes principales, no parece afectar su perspectiva. No sé si sea de mi parte un error de percepción, pues si es así me disculpo, pero lo explico mejor de manera gráfica.


1. Un cubo a la derecha con cámara en perspectiva.


2. El cubo se ha movido hacia el centro.


3. Ahora está a la derecha y el punto de vista ha cambiado por completo para el cubo.

Lo que he podido apreciar en el caso de la imagen que puse de Street Fighter, es que no importa en dónde esté el personaje, siempre se verá desde el mismo ángulo. Algo así como esto:


4. A pesar de que el cubo está totalmente a la izquierda, se sigue conservando la manera de verse cuando estaba a la derecha.

¿Estoy mal?

Gracias.
;)


[EX3]

#3
Yo al menos, la mayoria de juegos 2.5D que he jugado, ademas de Shadow Complex (video enlazado en el post anterior), juegos como Prince of Persia Classic (video), Rochard (video) o Deadlight (video) si te fijas bien usan perspectiva 3D, no ortogonal, y en muchas ocasiones veras que los objetos no son planos a vista de la camara, que al fin y al cabo es lo que se busca con un 2.5D, darle profundidad real a los objetos y personajes ademas de escenario.

Street Fighter V, que lo pones de ejemplo y referencia, no lo he jugado pero viendo un video en Youtube (https://www.youtube.com/watch?v=gTas1o3gz5Y) veo que tambien aplica perspectiva 3D real. La sensacion que tu tienes de que siempre son planos los personajes de vista a la camara es por que la camara siempre se situa en el centro de la accion entre ambos personajes, cosa que no siempre pasa en los otros juegos que te mencionaba antes. En un plataformas cinematico puede estar fija, moviendose y aplicar distintos angulos o zoom, lo que cambiara de una manera u otra el como ves a los personajes.

¿Que se puede usar perspectiva isometrica o caballera en un 2.5D? Tambien, ¿por que no? Todo depende de que estilo busques o si quieres conservar proporciones identicas sin importar posicion de la camara, pero claro, entonces vas a perder la gracia de usar angulos distintos, FOV y otros recursos del 3D que en vista ortogonal pierdes.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

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

PIM

Muy interesante. Ahora que lo mencionas, efectivamente parece que la cámara siempre se sitúa en medio de la acción, y es por ello que parece que los personajes parecen tener siempre la misma perspectiva. No había notado esto hasta que, gentilmente me lo hiciste ver.

Te lo agradezco mucho.  :D

Saludos.
;)

Gallo

#5
El tema de centrar la cámara en la acción influye en tu percepción si, pero realmente el truco de estos juegos es no utilizar perspectiva 3D o elementos 3D al 100%, algunos elementos son planos o 3D pero modelados de una forma poco realista y exajerada, pero la técnica mas interesante y que creo que es lo que estas buscando es la de renderizar objetos 3D con una matriz ortonormal en lugar de perspectiva, o incluso mezclar una de perspectiva con una de shearing para eliminar esa "fuga" en los extremos de la pantalla, aquí tienes un hilo en stackoverflow sobre el tema:

http://gamedev.stackexchange.com/questions/86960/mixing-perspective-and-orthographic-projections

PIM

#6
Muy interesante. Pero, a menos de que me equivoque, si yo por ejemplo rendereo un objeto u objetos 3d usando una proyección ortonormal usando por ejemplo glortho, queda bien. El problema viene cuando el fondo ya no se ve en perspectiva. Y si primero rendereo los objetos de frente con glortho y después el fondo con gluperspective, se "desfasan" los objetos 3d del fondo. Pues mientras los primeros están en un "espacio" que tiene por lo general el tamaño de la pantalla X: 0 a anchoPantalla, el fondo se renderea en un sistema de coordenadas que va de X: -1 a 1. 

¿Me equivoco?

Saludos y gracias por tu(s) respuesta(s)
:)

Ray

#7
yo creo te lo que se usan son billboards, que son simples rectángulos con textura que solo tiene la particularidad de que siempre están orientados a la cámara, es lo que se usaba para los objetos en la prehistoria del 3D.  Así que no te tienes que complicar con las proyecciones ni hacerlo por separado, lo único que tienes que hacer es dibujar un rectángulo y tratarlo como un objeto 3D más, cuando la cámara se aleje o se desplace, el objeto lo hará con el escenario.

Simplemente antes de dibujarlo hay que establecer la matriz de modelado para que el objeto se dibuje orientado a la cámara. Que creo que era multiplicando la matriz del objeto por la de la cámara. Es decir, que la matriz del objeto siempre ha de ser la de identidad en su rotación, solo se modificaría la posición, y esa matriz al multiplicarla por la de la cámara justo antes de dibujar rotaría el objeto para dejarlo orientado, aunque bueno, no me acuerdo muy bien pero algo así creo recordar.

Pero vamos, seguro que hay mucha info por ahí, si es eso lo que quieres busca como billboard o impostor.

http://www.lighthouse3d.com/opengl/billboarding/


Gallo

Cita de: PIM en 09 de Diciembre de 2016, 12:10:28 AM
Muy interesante. Pero, a menos de que me equivoque, si yo por ejemplo rendereo un objeto u objetos 3d usando una proyección ortonormal usando por ejemplo glortho, queda bien. El problema viene cuando el fondo ya no se ve en perspectiva. Y si primero rendereo los objetos de frente con glortho y después el fondo con gluperspective, se "desfasan" los objetos 3d del fondo. Pues mientras los primeros están en un "espacio" que tiene por lo general el tamaño de la pantalla X: 0 a anchoPantalla, el fondo se renderea en un sistema de coordenadas que va de X: -1 a 1. 

¿Me equivoco?

Saludos y gracias por tu(s) respuesta(s)
:)

A ver, te aseguro que para conseguir lo que quieres lo puedes hacer con modelos 3D  manipulando la matriz de transformación, el hilo que puse de stack overflow menciona un par de ejemplos buenos, el de Guilty Gear Xrd donde crean una matriz hybrida en la que en el eje horizontal hay 70% de ortogonal 30% de perspectiva para que no se fugue en los extremos de la pantalla como comentaba, el otro ejemplo, el que pre-fuga los objetos según la posición de la cámara también es interesante, aunque no ponen un ejemplo de juego donde se utilice.

El problema es al ver este comentario que has hecho, que para empezar la funcionalidad built-in de matrices de OpenGL quizá no sea lo mas adecuado ya que tienes que crear la matriz a mano para hacerla hybrida, supongo que se puede hacer con la built-in pero yo por ejemplo ya solo utilizo shaders a los que le paso una matriz manipulada por mi y si lo necesito la vuelvo a manipular en el shader, es como se hace hoy en día.

Lo que tienes que tener en cuenta es que OpenGL es una API para dibujar en 2D, todo lo que haces por mucho que emplees coordenadas 3D son solo para cálculos matemáticos que acaban siendo rasterizados en un plano 2D, con lo cual ese "desfase" del que hablas es que simplemente estas dejando que las mates u OpenGL hagan algo que deberías manipular tu, no se si me explico pero a veces, sobretodo al empezar, hay esa falsa percepción de que te tienes que adaptar a lo que te deja hacer OpenGL pero cuando se trata de pintar, teniendo shaders en realidad puedes hacer lo que te de la gana, se trata solo de encontrar las matemáticas adecuadas.


TrOnTxU

#9
A mi más bien me parece  que lo que pasa es que los personajes del street fighter no estan rotados sino flipeados.
(si os fijais la sombra cae a la izquierda siempre, o sea que la iluminacion direccional vendria de la derecha)

Escala en X = -1.0

¿es esa la pregunta?
Vicent: Linked-In  ***  ¡¡Ya tengo blog!!






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.