A comunidade brasileira de desenvolvimento e programação de jogos.
Bem-vindo: Sáb Out 31, 2020 6:31 pm

Todos os horários são GMT - 3 horas




Criar novo tópico Responder  [ 1 mensagem ] 
Autor Mensagem
 Título: Game em 2D: 3D sobre 2D
MensagemEnviado: Sáb Jan 23, 2010 10:52 am 
Offline
Membro novo

Registrado em: Sáb Jan 23, 2010 10:17 am
Mensagens: 1
Localização: Rio de Janeiro
Pessoal,

Sou completamente iniciante em OpenGL e estou desenvolvendo uma engine de jogos 2D. Só que eu gostaria muito de inserir alguns recursos 3D na engine. No caso, em princípio, gostaria de desenhar polígonos 3D após ter desenhado tudo em 2D. Acredito que as aplicações são diversas, por exemplo, eu poderia carregar um modelo 3D diretamente sobre o jogo 2D ou criar efeitos de partículas em 3D no meio de um simples jogo 2D. Acontece que devido minha falta de conhecimento do OpenGL não estou mesmo conseguindo fazer isso. Acredito que deva ser muito fácil, mas, não estou conseguindo.

É o seguinte: após desenhar tudo em 2D eu gostaria de desenhar uma simples caixa em 3D. O problema é que a caixa não é exibida corretamente conforme deveria. Só aparecem linhas. As laterais da caixa não são exibidas.

Qualquer ajuda é bem vinda! ;-)

Segue a imagem do jogo rodando:

Imagem

Segue o link para uma melhor visualização da imagem:

http://picasaweb.google.com.br/lh/photo/q3-YgQTm8ZxTQjAgvDhX1Q?feat=directlink

Segue o código que estou usando para tentar alcançar isso:

Muda para 3D:

int viewport[4];
glGetIntegerv( GL_VIEWPORT, viewport );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 50.0f, (GLdouble)viewport[2] / (GLdouble)viewport[3], 1, 10000 );

glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glEnable( GL_DEPTH_TEST ); //enable this for proper 3D viewing

Desenha a caixa:

glDisable(GL_BLEND);

glMatrixMode(GL_MODELVIEW);
glTranslatef(0, 0, -5.5F);

glRotatef(r,1,0,1);
glEnable(GL_DEPTH_TEST);

glBegin(GL_QUADS);
glNormal3f( 0.0F, 0.0F, 1.0F);
glVertex3f( 0.5F, 0.5F, -1); glVertex3f(-0.5F, 0.5F, -1);
glVertex3f(-0.5F,-0.5F, -1); glVertex3f( 0.5F,-0.5F, -1);

glNormal3f( 0.0F, 0.0F,-2);
glVertex3f(-0.5F,-0.5F,-2); glVertex3f(-0.5F, 0.5F,-2);
glVertex3f( 0.5F, 0.5F,-2); glVertex3f( 0.5F,-0.5F,-2);

glNormal3f( 0.0F, 1.0F, 0.0F);
glVertex3f( 0.5F, 0.5F, -1); glVertex3f( 0.5F, 0.5F,-2);
glVertex3f(-0.5F, 0.5F,-2); glVertex3f(-0.5F, 0.5F, -1);

glNormal3f( 0.0F,-1.0F, 0.0F);
glVertex3f(-0.5F,-0.5F,-2); glVertex3f( 0.5F,-0.5F,-2);
glVertex3f( 0.5F,-0.5F, -1); glVertex3f(-0.5F,-0.5F, -1);

glNormal3f( 1.0F, 0.0F, 0.0F);
glVertex3f( 0.5F, 0.5F, -1); glVertex3f( 0.5F,-0.5F, -1);
glVertex3f( 0.5F,-0.5F,-2); glVertex3f( 0.5F, 0.5F,-2);

glNormal3f(-1.0F, 0.0F, 0.0F);
glVertex3f(-0.5F,-0.5F,-2); glVertex3f(-0.5F,-0.5F, -1);
glVertex3f(-0.5F, 0.5F, -1); glVertex3f(-0.5F, 0.5F,-2);
glEnd();

Volta para 2D e continua trabalhando em 2D:

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluOrtho2D( 0, viewport[2], viewport[3], 0 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity(); //remember to call this so your modelview transformations are all reset.
glDisable( GL_DEPTH_TEST ); //disable this for proper 2D viewing


[24/01/2010]

Pessoal,

Finalmente consegui resolver o problema, mas, tiver que fazer muitas mudanças pra conseguir. O problema é que os objetos estavam sendo desenhados no mesmo ponto do eixo z. Daí foi necessário colocar cada objeto em sua posição no eixo z.

Veja um screenshot do resultado:

Imagem

Segue o código caso você também tenha interesse em conseguir o mesmo resultado.

Tive de criar uma função para mudar para 2D:

void GrhDriver::Switch2D()
{
static int viewport[4];
glDisable(GL_LIGHTING);
glEnable(GL_TEXTURE_2D);
glGetIntegerv( GL_VIEWPORT, viewport );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluOrtho2D( 0, viewport[2], viewport[3], 0 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}

Outra pra mudar pra 3D:

void GrhDriver::Switch3D( float zoom )
{
static int viewport[4];
glGetIntegerv( GL_VIEWPORT, viewport );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
//gluPerspective(zoom, (GLdouble)viewport[2] / (GLdouble)viewport[3], 1, 10 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}

Foi necessário criar profundidade para cada camada 2D do jogo. Isso eu alterei com glTranslatef( scx, scy, depth );

Daí, é necessário determinar a profundidade de cada objeto antes de desenhar:

//Primeira camada de tiles:
GrhDrv.SetDepth( -0.99999 );
GameLevel.BlitL1Tiles();

//segunda camada de tiles:
GrhDrv.SetDepth( -0.99998 );
GameLevel.BlitL2Tiles();

//desenha todos os NPCs, players e montros, etc;
GrhDrv.SetDepth( -0.99997 );
ActorsDrawList.Draw();

//desenha a animação executada quanto o player ataca:
GrhDrv.SetDepth( -0.99897 );
HeroAttack.DoFullLogic();

//terceira camada de tiles
GrhDrv.SetDepth( -0.94000 );
GameLevel.BlitL3Tiles();

//aqui eu mudo para 3D e desenho todos os objetos 3D que desejar
GrhDrv.Switch3D();
DrawQuads(r, zFar, 1.0, 0.0);
DrawQuads(r, zFar, -1.0, 0.0);
DrawQuads(r, zFar, 0.0, 1 );
DrawQuads(r, zFar, 0.0, -1 );

//aqui eu volto novamente para 2D
GrhDrv.Switch2D();


Voltar ao topo
 Perfil  
 
Exibir mensagens anteriores:  Ordenar por  
Criar novo tópico Responder  [ 1 mensagem ] 

Todos os horários são GMT - 3 horas


Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante


Enviar mensagens: Proibido
Responder mensagens: Proibido
Editar mensagens: Proibido
Excluir mensagens: Proibido
Enviar anexos: Proibido

Ir para:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traduzido por: Suporte phpBB