Introdução ao desenvolvimento de jogos em OGRE 3D - Mackenzie

55
Introdução ao Desenvolvimento de Jogos em Ogre 3D Autor: Jonathan Ohara de Araujo

description

Slides da minha apresentação no evento Mackenzie realizado em 29/11/2012. Agradecimento Especial a Luiz Dubas @luizdubas pela artes do slide

Transcript of Introdução ao desenvolvimento de jogos em OGRE 3D - Mackenzie

Introdução ao Desenvolvimento de Jogos

em Ogre 3D

Autor:

Jonathan Ohara de Araujo

Sobre Mim

23 anos;

Bacharel em Sistemas de Informação pela Universidade Católica de Santos;

Trabalho com Java para sistemas Web;

Estudo desenvolvimento de jogos desde 2009;

2 projetos na área de jogos: Shyds; PontoV.

Shyds Games - http://shydsgames.com/

Criado para armazenar nossos jogos, news e como blog de desenvolvimento;

Projetos: Bola de Pano; Tumbu; Black Amber; Sem nome (Em desenvolvimento).

Shyds Games – Bola de Panohttp://shydsgames.com/

Shyds Games – Tumbuhttp://shydsgames.com/

Shyds Games – Black Amberhttp://shydsgames.com/

Shyds Games – Sem Nomehttp://shydsgames.com/

PontoV - http://www.pontov.com.br/

Artigos sobre desenvolvimentos de jogos em geral;

Escrevo na coluna sobre Ogre3D

Introdução ao Desenvolvimento de Jogos em Ogre 3D

Introdução;

Principais Trabalhos;

Características e Features;

Ferramentas;

Ogre API;

Considerações Finais;

Introdução

Ogre 3D

OGRE == Object-Oriented Rendering Engine;

Object-Oriented;

Rendering Engine;

Escrita em C++;

Ogre 3DBreve História

Steve Streeting;

Iniciado em 2000;

Release 1.0 (Azathoth) lançado em 02/2005;

Atualmente na versão 1.8.1 (Byatis) lançada em 09/2012.

Principais Trabalhos

Ogre3DPrincipais Trabalhos

Garshasp - The Monster Slayer;

Family Farm;

Project Aftershock;

TorchLight;

Garshap

Family Farm

Project AfterShock

TorchLight

TorchLight

Desenvolvido pela Runnic Games;

Lançado em outubro de 2009;

Maioria das bibliotecas utilizadas são Open Source;

TorchLight

No dia 6 de agosto de 2010 o número de vendas já ultrapssava 600 mil vendas (fonte: Gamasutra);

Foi pago pelo jogo 20 dólares (caixa) e 10 dólares pelo download.

Característicase

Features

Ogre 3DPrincipais características

Orientada a Objetos;

Orientada a cenas (Grafos);

Produção de Aplicações Gráficas 3D aceleradas por Hardware;

Abstração o do uso de OpenGl e DirectX.

Ogre 3DPrincipais Features

Multiplataforma (Windows, Linux, Mac OS);

Iphone;

Renderiza em DirectX 9, DirectX 10, OpenGL e OpenGL ES;

Ogre 3DPrincipais Features

Suporta Shader em CG, DirectX HLSL e OpenGL GLSL;

Level Of Detail;

Tipo de Imagens suportadas: PNG, JPEG, TGA, BMP, PVRTC, DDS;

Sistema de Partículas.

Ogre 3DOutras Features

Plugins para exportar para os principais modeladores 3D;

Carrega arquivos compactados (zip, pk3);

Frameworks para facilitar integração com as principais Engines Físicas;

Integração com o OIS;

Ogre 3DFeatures de Próximos Releases

Suporte a Android(Android NDK) e Windows Phone 8;

Renderização em DirectX 11;

Renderização via Rede.

Ogre 3DPrincipais Vantagens

Desempenho; Multiplataforma; Open Source (MIT License); Boa documentação; Grande Comunidade ativa; Grande número de plugins, add-nos e

bibliotecas gratuitas; Ser apenas uma engine gráfica.

Ogre 3DPrincipais Desvantagens

Tempo de Compilação; Não funcionar em consoles*; Ser apenas uma engine gráfica.

Ferramentas

GUI

BetaGUI; ButtonGUI; CEGUI; Hikari; libRocket; MyGUI; Navi; QucickGUI; TwOgre; Tiny GUI; Noesis GUI.

Som

OgreAL;

Ogre Ogg Sound;

Audiere.

Particulas

Particle Universe;

Particule FX;

Particle Accelerator;

Ogre Partciel Editor;

Ogre Particle Lab;

HellHeavenFx Ogre;

Outros

Ogitor;

SkyX;

Caelum;

Ogre Speed Tree;

HydraX;

OgreAPI

Arquivos doOgre 3D

.mesh;

.material;

.skeleton.

Inicialização do Ogre 3D

mRoot = new Ogre::Root(PLUGINS_CFG);

// Carregando as pastas dos resourcesOgre::ResourceGroupManager::getSingleton().addResourceLocation("media/materials/scripts", "FileSystem", "Popular");Ogre::ResourceGroupManager::getSingleton().addResourceLocation("media/materials/textures", "FileSystem", "Popular");Ogre::ResourceGroupManager::getSingleton().addResourceLocation("media/models", "FileSystem", "Popular");Ogre::ResourceGroupManager::getSingleton().addResourceLocation("media", "FileSystem", "General"); // mRoot->restoreConfig() Verifica se ja existe configuração no ogre.cfg// se existir retorna true e entra no if// senão cai no OU e mostra a tela para escolher configuraçãoif(mRoot->restoreConfig() || mRoot->showConfigDialog()){ // O primeiro parâmetro diz ao Ogre que ele pode criar uma janela para renderização // O segundo parâmetro é o titulo da Janela mWindow = mRoot->initialise(true, "Ponto V - Tutorial 1");}else{ // Caso o usuário aperte cancel na tela do ogre feche o programa return false;}

Inicialização do Ogre 3D

// Escolhendo o gerenciador de cenasmSceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC); // Cria a cameramCamera = mSceneMgr->createCamera("Camera");

// ViewPort é o que faz a cena ser renderizado pela cameraOgre::Viewport* vp = mWindow->addViewport(mCamera);// Cor de fundo do ViewPortvp->setBackgroundColour(Ogre::ColourValue(0, 0, 0));

// Muda o aspecto(width, height) da camera para se adequar ao ViewPortmCamera->setAspectRatio(Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));

// Carrega Todos resouresOgre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();

Grafo de CenasNó de Cena

O que é?

Nó raiz:

Criando um Nó de cena:

Ogre::SceneNode* node = sceneManager->createSceneNode("Node1");//ousceneManager->getRootSceneNode()->createSceneNode("Node1");

sceneManager->getRootSceneNode();

Grafo de CenasEntidades

O que é?

Criando uma entidade:

Anexando uma entidade a um nó:

Ogre::Entity* entidade = sceneManager->createEntity( “NomeDaEntidade“ , “arquivo.mesh“ );

node->attachObject(entidade);

Grafo de CenasHierarquia de Nós

Como funciona?Root Scene Node

Node 1

Entity

Grafo de CenasHierarquia de Nós

Root Scene NodePosicao ( 0, 0, 0 )

Node 1Posicao ( 10, 0, 0 )

EntityPosicao(10,0,0)

Node 2Posicao ( 0, 10, 20 )

Entity 2Posicao(10,10,20)

Transformações

node->setPosition(10,0,0);

node->scale(2.0f,2.0f,2.0f);

Posição:

Translação:

Escala:

node->translate(20,0,0);

Transformações

node->yaw( Ogre::Radian( 3.14f ) );

node->yaw( Ogre::Degree( 180 ) );

node->setOrientation( 0.0f, 0, 1, 0 );

node->rotate( Ogre::Quartenion( 0, 0, 1, 0 ) );

node->lookAt( Ogre::Vector3( 0, 0 ,0 ) );

node->pitch( Ogre::Degree( 180 ) );node->roll( Ogre::Degree( 180 ) );

Rotação:

Luz, Camera...e Sombras

Ogre::Light* luz = sceneManager->createLight( “luz1” );

luz->setType( Ogre::Light::LT_POINT );luz->setType( Ogre::Light::LT_DIRECTIONAL );luz->setType( Ogre::Light::LT_SPOTLIGHT );

Luz:

Luz, Camera...e Sombras

luz->setDiffuseColor( 1, 1, 1 );

node->attachObject( luz );

Luz:

Luz, Camera...e Sombras

sceneManager->setShadowTechnique( Ogre::SHADOWTYPE_NONE );sceneManager-

>setShadowTechnique( Ogre::SHADOWTYPE_STENCIL_ADTIIVE );sceneManager-

>setShadowTechnique( Ogre::SHADOWTYPE_STENCIL_MODULATIVE );

sceneManager->setShadowTechnique( Ogre::SHADOWTYPE_ADDITIVE );

sceneManager->setShadowTechnique( Ogre::SHADOWTYPE_MODULATIVE );

Sombras:

Luz, Camera...e Sombras

Ogre::Camera* camera = sceneManager->createCamera( “camera1” );

camera->setNearClipDistance( 5 );camera->setFarClipDistance( 5000 );

node->attachObject( camera );

Camera:

OISObject Oriented Input System

mInputManager = OIS::InputManager::createInputSystem( pl ); mKeyboard = static_cast<OIS::Keyboard*>(mInputManager-

>createInputObject( OIS::OISKeyboard, true ));

mMouse = static_cast<OIS::Mouse*>(mInputManager->createInputObject( OIS::OISMouse, true ));

Inicializando:

OISObject Oriented Input System

class nomeDaClasse: public OIS::KeyListener, public OIS::MouseListener

...

mMouse->setEventCallback(this);mKeyboard->setEventCallback(this);

...

mKeyboard->capture();mMouse->capture();

Capturando Entradas:

OISObject Oriented Input System

bool keyPressed( const OIS::KeyEvent &arg ){}bool keyReleased( const OIS::KeyEvent &arg ){}

bool mouseMoved( const OIS::MouseEvent &arg ){}bool mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id ){bool mouseReleased( const OIS::MouseEvent &arg, OIS::MouseButtonID id ){

Métodos da Interface:

Animação

Ogre::AnimationState* andar = entidade->getAnimationState( “andar” );

Ogre::AnimationStateSet* animacoes = entidade->getAllAnimationsStates();

Pegando animações de uma entidade:

Animação

andar->setTimePosition(0);andar->setEnabled(true);andar->setLoop(true);

...

//no seu método de atualização de frameandar->addTime( deltaTime );

Animando

Considerações Finais

Bibliografia

OGRE Wiki. Disponível em: http://www.ogre3d.org/tikiwiki/

JUNKER, G. Pro Ogre 3D Programming. New York: Apress, 2006.

KERGER, Felix. Ogre 3D 1.7 Beginner’s Guide, 2010.

Dúvidas ?

Contato:[email protected]@jonathan_oharahttp://shydsgames.com/http://www.pontov.com.br/