Ponto V!

Home Ogre 3D Primeiro programa com Ogre 3D
Jonathan Ohara de Araujo
Primeiro programa com Ogre 3DImprimir
Escrito por Jonathan Araujo

No artigo passado conhecemos o básico do motor gráfico Ogre e neste artigo iremos ver como utiliza-lo implementando funções para inicializar o motor, criar uma janela e desenhar objetos nela, assim no final teremos um programa que carrega um modelo 3d e seu material.

O resultado final do artigo pode ser visualizado na imagem a seguir.

O exemplo em execuçãoNote que neste primeiro tutorial iremos apenas mostrar de forma simplificada como iniciar a programação Ogre, sendo que nos próximos artigos iremos então explorar detalhadamente cada um dos tópicos abordados aqui. Essa didática foi escolhida de forma a evitar que o leitor seja confrontado inicialmente com uma enorme quantidade de tópicos.

Todos os programas deste artigo e dos futuros serão implementados em C++, partindo do princípio que o leitor já possui um conhecimento prévio da linguagem, ou seja, os artigos não serão focados em explicar a linguagem, mas sim a biblioteca, exceto é claro onde a se julgar necessário algum esclarecimento extra sobre o C++. Caso não tenha muita familiaridade com a linguagem recomendo uma leitura prévia de artigos sobre o assunto como os artigos da seção de “Conceitos Básicos” e em especial o Roadmap C++ onde o leitor encontra livros e apostilas sobre a linguagem.

A seguir iremos mostrar como criar um novo projeto Ogre usando o Visual C++, caso queira baixar o projeto pronto (que é útil por incluir os arquivos de modelos 3d) clique aqui. Apesar do artigo mostrar o passo a passo do projeto no Visual C++, o leitor pode usar os códigos na IDE que preferir sem grandes problemas.

Criando o Projeto

Crie um novo projeto em sua IDE e de preferência escolha opção com console (Console Application), caso você já tenha um projeto e não tenha escolhido como Console Application, ou você tenha usado o Ogre App Wizard, você ainda pode ativar o recurso do console. No Visual Studio 2008 e 2010 basta você clicar com botão direito no projeto e escolher: propriedades do projeto > linker > SubSystem e selecione “Console (/SUBSYSTEM:CONSOLE)”. Em seguida, escolha a aba “Advanced” (ainda dentro das configurações do linker) e na caixa “Entry Point:” insira: WinMainCRTStartup.

Com isso junto da janela do Ogre será aberto um console em segundo plano onde a saída de funções como printf, mensagens do ogre, etc, serão mostrados.

O uso do console não é obrigatório para o funcionamento do Ogre e nem deste tutorial, mas pode ser um ótimo aliado na hora de testar aplicativos ou procurar problemas.

Iniciando o Código

Nesse primeiro tutorial resolvi resumir tudo em apenas um arquivo e uma classe, para uma aplicação maior é extremamente recomendado você utilizar uma estrutura melhor construída. Alguns exemplos você pode conferir na wiki do Ogre: Ogre Wiki Tutorial Framework e Advanced Ogre Framework.

Primeiro vamos ver todo o código e na seqüência vamos analisando cada trecho:

#include <ctime>
#include <cstdlib>
#include <iostream>

#include <Ogre.h>

using namespace std;

#ifdef _DEBUG
#define PLUGINS_CFG "plugins_d.cfg"
#else
#define PLUGINS_CFG "plugins.cfg"
#endif

class Tutorial1 {
private:
    Ogre::Root *mRoot;
    Ogre::Camera* mCamera;
    Ogre::SceneManager* mSceneMgr;
    Ogre::RenderWindow* mWindow;

public:
    Tutorial1(void){}
    ~Tutorial1(void){
        delete mRoot;
    }

    bool initializeOgreStuff(){
        srand( (unsigned)time( NULL ) );    
 
        // Construi o Root do Ogre
        mRoot = new Ogre::Root(PLUGINS_CFG);
 
        // Carregando as pastas dos resources
        Ogre::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ção
        if(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;
        }

        // Escolhendo o gerenciador de cenas
        mSceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC);
            
        // Cria a camera
        mCamera = mSceneMgr->createCamera("Camera");
 
        // ViewPort é o que faz a cena ser renderizado pela camera
        Ogre::Viewport* vp = mWindow->addViewport(mCamera);
        // Cor de fundo do ViewPort
        vp->setBackgroundColour(Ogre::ColourValue(0, 0, 0));
 
        // Muda o aspecto(width, height) da camera para se adequar ao ViewPort
        mCamera->setAspectRatio(Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));
        // Coloca o número padrão de MipMaps
        Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5);

        // Carrega Todos resoures
        Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
        
        return true;
    }

    bool runApplication(){
        // Cria um array com meshes que vem no sdk do ogre
        Ogre::String enityNames[] = {"fish", "knot", "ninja", "ogrehead", "penguin", "razor", "robot", "WoodPallet"};

        // Posiciona a Camera
        mCamera->setPosition(Ogre::Vector3(0, 0, 200));
        // Manda a camera olhar para um ponto
        mCamera->lookAt(Ogre::Vector3(0, 0, -300));
        // Distancia mínima para que o objeto deve estar da camera para ser renderziado
        mCamera->setNearClipDistance(5);
        // Distancia máxima para que o objeto deve estar da camera para ser renderziado
        mCamera->setFarClipDistance(500);
            
        //Gero um número randomico entre 0 e 7
        int randomMeshPosition = rand() % 8;        

        // Crio um nó filho do nó raiz na hierarquia de cena
        Ogre::SceneNode* node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode("no1");
        // Crio uma entidade nesse caso um mesh a partir do resultado randomico
        Ogre::Entity* entity = mSceneMgr->createEntity( enityNames[randomMeshPosition], enityNames[randomMeshPosition].append(".mesh"));
        // Coloco esse mesh no nó
        node1->attachObject(entity);

        // Cria Luz ambiente
        mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));
 
        // Cria uma Luz
        Ogre::Light* l = mSceneMgr->createLight("Luz");
        l->setPosition(20, 80, 50);                

        //Loop Principal
        for(;;){
            // Processa as mensagens que o Sistema Operaciona envia para aplicação
            Ogre::WindowEventUtilities::messagePump();

            // Parar o programa caso a janela seja fechada
            if(mWindow->isClosed()){
                return false;
            }

            node1->yaw(Ogre::Degree(0.01));            

            // Renderiza Um Frame
            if(!mRoot->renderOneFrame()) return false;
        }
        return false;
    }
};
    
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
#endif
 
#ifdef __cplusplus
extern "C" {
#endif
 
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
    INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
    int main(int argc, char *argv[])
#endif
    {
        Tutorial1 application;
        try {
            if( application.initializeOgreStuff() ){
                application.runApplication();
            }
        } catch( Ogre::Exception& e ) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
            MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
            std::cerr << "An exception has occured: " <<
                e.getFullDescription().c_str() << std::endl;
#endif
        }
 
        return 0;
    }
 
#ifdef __cplusplus
}
#endif

A principio parece algo complexo,mas vamos começar a estuda-lo passo a passo, primeiro então temos os arquivos include:

#include <Ogre.h>

O arquivo Ogre.h contém maioria dos arquivos includes que você irá utilizar com o Ogre.

Logo após temos a classe Tutorial1 que é quem cuida de praticamente tudo neste program exemplo, inicializa o Ogre e contém o loop principal da aplicação, esta classe foi dividida em apenas dois métodos:

bool initializeOgreStuff();

bool runApplication();

Vamos ver então a função de cada um destes métodos.

Inicializando o Ogre

O método initializeOgreStuff é responsável por iniciar tudo em relação ao Ogre e o método runApplication, nosso principal foco nesse artigo, é responsável pela nossa aplicação.

Vou rapidamente explicar o que acontece no método initializeOgreStuff, começando pelas variáveis privadas da classe:

  • Ogre::Root *mRoot: é a principal classe interna do Ogre responsável pelo sistema de renderização, gerenciar configurações, mensagens e por acessar outras classes no sistema.
  • Ogre::SceneManager* mSceneMgr: é responsável por todo gerenciamento da cena e do grafo de cena, que é responsável por gerenciar elementos das cenas. Existem diferentes gerenciadores de cena no Ogre e cada um possuí uma finalidade específica, para a aplicação de demonstração selecionamos a versão genérica que implementa apenas um sistema de culling simplificado.
  • Ogre::Camera *mCamera: é o objeto responsável pela câmera que irá “filmar” a nossa cena, ou seja, a partir dela, o Ogre vai saber o que deve ser renderizado ou não;
  • Ogre::RenderWindow* mWindow: representa a janela do sistema operacional que o Ogre vai renderizar.

Agora vamos conferir pontos principais deste método:

Ogre::ResourceGroupManager::getSingleton().addResourceLocation("media/materials/scripts", "FileSystem", "Popular");

O método acima serve para adicionar um diretório ou arquivo para o Ogre posteriormente ler seus modelos, imagens e etc. Ele recebe 3 parâmetros: o diretório ou arquivo, o tipo que pode ser FileSystem (pasta normal) ou Zip (arquivo compactado), e o terceiro parâmetro qual o grupo que pertence esse recurso. É muito util organizar os recursos em grupos , pois, em projetos maiores, você poderá carregar apenas os grupos quando realmente precisar. Um exemplo disso é você dividir os recursos em fases, ou seja, todos os recursos utilizados na primeira fase você coloca no grupo fase1, todos recursos da segunda fase no grupo fase2 e assim sucessivamente, assim ao começo de cada fase você só irá carregar os recursos que utilizará naquela fase.

Em seguida temos código responsável por carregar as configurações do motor:

if(mRoot->restoreConfig() || mRoot->showConfigDialog())
{
    mWindow = mRoot->initialise(true, "Ponto V - Tutorial 1");
}
else
{
    return false;
}

No trecho acima em mRoot->restoreConfig() é verificado se existe um arquivo com as configurações de vídeo (ogre.cfg que contém informações como resolução, renderizadores, etc), se não existir ele vai retornar falso, em mRoot->showConfigDialog() o Ogre irá mostrar uma janelinha de opções para você escolher as configurações, é muito recomendado você retirar isso em um projeto maior, pois este sistema de configuração foi feito mais pensando em simplificar a criação de exemplos e programas de teste. Por fim é chamado o método initialise do Ogre que tem como primeiro parâmetro um bool que diz se o Ogre pode criar sua janela para renderizar (ou se deve usar alguma pronta) e como segundo parâmetro o titulo da janela, o else acontece quando o usuário clica em cancelar na janela de configuração do Ogre.

Agora vamos criar nosso gerenciador de cena:

mSceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC);

Com o gerenciador de cena criamos nossa câmera:

mCamera = mSceneMgr->createCamera("Camera");

Criamos então um ViewPort que fará que a cena seja renderizada por essa câmera, e indicamos que a cor de fundo será preta:

Ogre::Viewport* vp = mWindow->addViewport(mCamera);

vp->setBackgroundColour(Ogre::ColourValue(0, 0, 0));

Ajustamos o aspecto largua / altura da câmera:

mCamera->setAspectRatio(Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));

E para finalizar carregamos todos os grupos de recursos como citado anteriormente:

Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();

E assim terminamos a inicialização Ogre e vamos ver agora na sequência como carregar o modelo e exibir ele na tela, mas primeiro vamos revisar rapidamente como Ogre lida com strings.

Strings no Ogre

Logo no inicio do método runApplication() temos a linha abaixo:

Ogre::String enityNames[] = {"fish", "knot", "ninja", "ogrehead", "penguin", "razor", "robot", "WoodPallet"};

Nó código acima temos um array de objetos do tipo Ogre::String, é importante observar que todos os métodos do Ogre usam o tipo Ogre::String ao invés do tipo string padrão do C++, porém o tipo Ogre::String é totalmente compatível com a tradicional std::string, sendo que geralmente é apenas um typedef de std::string. Com uma variável Ogre::String em mãos podemos recuperar a string como um ponteiro de char do seguinte modo:

Ogre::String ogreString("ola mundo");

cout << ogreString.c_str() << endl;

No array de String temos nomes de algumas meshes que vem com o Ogre (localizadas em: pontov_tutorial_01/work/media/models, dentro do arquivo zip do projeto).

Configurando a Câmera

O próximo trecho é referente ao gerenciamento da nossa câmera que é demonstrado no código a seguir:

mCamera->setPosition(Ogre::Vector3(0, 0, 200));

mCamera->lookAt(Ogre::Vector3(0, 0, -300));
mCamera->setNearClipDistance(5);
mCamera->setFarClipDistance(500);

O objeto Ogre::Vector3 (mais informações sobre vetores em: O uso de vetores nos jogos ) é um simples vetor tridimensional encontrado na maioria do motores de jogos. O objeto possui uma grande variedade de construtores, porém o mais comumente usado é o que estamos usando acima, que são 3 parâmetros do tipo Ogre::Real que equivalem ao eixos X, Y e Z respectivamente.

É importante observar que apesar da classe ser chamada de Vector e possuir métodos de operações com vetores, ela também é usada para armazenar apenas pontos, sendo que seu uso é o mesmo do uso de um vetor, ficando a cargo do desenvolvedor decidir de acordo com o contexto se uma instância de Vector representa um ponto ou um vetor, usando assim os métodos adequados para cada situação.

Eixo X, Y, Z em relação ao monitor

O tipo Ogre::Real é um sinônimo do tipo ponto flutuante, feito principalmente para normalizar a precisão entre os diferentes sistemas operacionais para o tipo float e double. O uso do Ogre::Real permite a um desenvolvedor recompilar o Ogre para usar um ponto flutuante de precisão simples (float – mais comum em jogos) ou de dupla precisão (double geralmente usado em aplicações científicas ou simulações) de maneira simples.

Voltando a inicialização da câmera vemos primeiramente o método setPosition, com ele você posiciona a câmera no espaço tridimensional, existe uma sobrecarga desse método recebendo 3 parâmetros do tipo Ogre::Real representando X, Y e Z respectivamente, caso prefira.

O segundo método é o lookAt, que traduzindo para o português seria “olhar para”, que fala pra câmera qual direção ela deve “filmar” e em qual ponto focar, ou seja, ele rotaciona e “mira” a câmera para ela ficar de frente para o ponto passado por parâmetro, ela recebe um Ogre::Vector3 ou três parâmetros do tipo Ogre::Real que indicam o ponto no espaço para qual a câmera vai olhar.

Após temos os métodos que tem como sufixo ClipDistance, que traduzindo temos “distância de corte”, no caso de Near ou traduzindo “perto”, indica qual a distância mínima que um objeto tem que estar da câmera para ele ser renderizado, e no Far ou traduzindo “longe”, indica qual a distância máxima que o objeto tem que estar da câmera para ele ser renderizado.

Carregando Objetos

Para este projeto temos disponível oito objetos diferentes e toda vez que executamos o programa ele seleciona de forma aleatória um objeto a ser usado, o sorteio é feito pelo trecho de código a seguir:

int randomMeshPosition = rand() % 8;

Agora criaremos um nó de cena utilizando a classe SceneNode, que representa os nós usados para montar o grafo de cena do Ogre, os objetos só são renderizados se forem associados a um SceneNode e este SceneNode estiver anexado ao grafo da cena. É importante ressaltar que tudo que é aplicado em um SceneNode como movimentos e ou rotações são feitas relativas ao SceneNode pai, ou seja, se nó pai estiver em x = 5, y= 0, z = 0, o nó filho terá como posição real x = 5, y= 0, z = 0 e como posição relativa x = 0, y = 0 e z = 0.

Para melhor entender um grafo de cena e sua hierarquia de nós podemos ter em mente que apesar de ser um grafo ele na verdade forma uma árvore, onde temos um nó raiz ou pai da hierarquia que é o ponto inicial da árvore. Cada nó pode ter 0 ou n nós filhos. Assim temos uma estrutura semelhante a uma estrutura de pastas do sistema de arquivos de um computador. Assim como num sistema de arquivos, onde quando movemos uma pasta todas as suas sub-pastas são movidas temos um efeito semelhante num grafo de cena, pois toda vez que um nó é movido, seus nó filhos se movimentam também e o mesmo vale para rotações e outras operações, como escala.

É importante também ressaltar que a posição e a transformação de um nó é sempre referente ao seu nó pai, ou seja, se movimentarmos um nó 10 unidades em um eixo qualquer, seus filhos também se movimentaram 10 unidades nesta mesma direção. Para melhor entender um grafo de cena, recomendamos a leitura do artigo Scene Graph.

Voltando ao código, vamos então criar um nó que será filho do nó que está na raiz, é importante observar que NÃO podemos ter dois nós como mesmo nome no mesmo grafo de cena, isso gerará um erro de execução. O trecho de código a seguir mostrar como criar esse nó que será chamado “no1”:

Ogre::SceneNode* node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode("no1");

Agora vamos criar uma entidade utilizando a class Ogre::Entity, as entidades no Ogre são responsáveis por carregar os objetos 3D e elas também são criadas pelo Ogre::SceneManager, no nosso exemplo invocamos o método com dois parâmetros: o nome da entidade e o nome do arquivo do modelo tridimensional, como podemos ver a seguir:

Ogre::Entity* entity = mSceneMgr->createEntity( enityNames[randomMeshPosition], enityNames[randomMeshPosition].append(".mesh"));

É importante dizer que o nome da entidade (primeiro parâmetro do método createEntity) não tem conexão nenhuma com o nome do arquivo e nome da entidade deve ser único no gerenciador de cenas, ou seja, no mesmo gerenciador de cenas não podemos ter duas entidade com o mesmo nome. Em seguida adicionamos a extensão “.mesh”, que é o tipo padrão de arquivo do Ogre para armazenar malhas (você pode encontrá-los em: pontov_tutorial_01\work\media\models) e através do método append concatenamos o nome da mesh a extensão, ou seja, se executarmos:

cout << Ogre::String("athene").append(".mesh") << endl;

A saída será “athene.mesh”.

Agora associaremos nossa entidade criada ao nó chamado “no1”:

node1->attachObject(entity);

Dessa forma, associamos a entidade com este nó e ela será desenhada onde o nó for. Note que no Ogre a orientação, posição, escala e etc dos objetos são controlados pelos nós de cena, enquanto os objetos são controlados pela classe Entidade.

Em seguida modificamos a luz ambiente da cena e criamos um ponto de luz para melhorar o contraste da cena:

mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));

Ogre::Light* l = mSceneMgr->createLight("Luz");

l->setPosition(20, 80, 50);

As luzes também são criadas a partir do gerenciador de cena e se necessário podem ser associadas a nós da cena e em artigos futuros veremos de forma mais detalhada como funciona o sistema de iluminação do Ogre.

Após isso temos nosso loop principal que pode ser visto a seguir:

for(;;)
{
    //Processa as mensagens do sistema
    Ogre::WindowEventUtilities::messagePump();

    // Parar o programa caso a janela seja fechada
    if(mWindow->isClosed())
    {
        return false;
    }

    //rotaciona o no do objeto
    node1->yaw(Ogre::Degree(0.01));

    // Renderiza Um Frame
    if(!mRoot->renderOneFrame()) 
        return false;
}

O método Ogre::WindowEventUtilities::messagePump() é responsável por processar as mensagens que o sistema operacional envia a aplicação, como neste exemplo deixamos a criação da janela por conta do Ogre, este também vai cuidar de processar todos os eventos que o sistema enviar.

Em seguida o programa verifica se a janela de renderização ainda esta aberta, caso não, encerra o loop principal.

Na linha “node1->yaw(Ogre::Degree(0.01));” pedimos ao nó de cena que se rotacione 0,01 graus, adicionamos isto apenas para criar um efeito melhor no exemplo.

Finalmente renderizamos um quadro através do método mRoot->renderOneFrame()).

Assim criamos nosso primeiro programa usando Ogre, que pode ser baixado clicando-se aqui.

Nesse artigo vimos o básico sobre a estrutura do Ogre 3D e conhecemos classes fundamentais como Ogre::Root, Ogre::SceneManager, Ogre::Real, Ogre::String, Ogre::Vector3, Ogre::SceneNode e Ogre::Entity e aprendemos como fazer um visualizador de modelos. Em artigos futuros iremos explorar os sub-sistemas do Ogre em detalhes.

Compilando o Exemplo

Para o programa exemplo compilar corretamente usando os projetos do Visual é esperado que o ambiente possua uma variável de ambiente “OGRE_HOME” que indique a localização do Ogre s suas bibliotecas, sendo que o programador pode reconfigurar o projeto para achar a biblioteca de outra forma ou seguir este outro tutorial para configurar como esperado.

Após compilar, o projeto só vai executar corretamente se encontrar as dlls do Ogre e os arquivos de recurso que ele precisa para rodar, para executar a partir do Visual usando as teclas CTRL+F5 ou F5, configure o diretório de trabalho e o ambiente do projeto conforme mostrado abaixo:

03_properties

Para acessar este tela, clique com o botão direito do mouse no seu projeto, escolha “Properties” e na janela que se abrir, selecione “Debugging”.

Em “Working Directory” entre com “$(ProjectDir)work “ e em “Environment entre com “PATH=$(OGRE_HOME)\build\bin\debug” ou “PATH=$(OGRE_HOME)\build\bin\release” se estiver compilando a versão release do projeto.

Downloads

Código fonte + arquivos de recursos: pontov_tutorial_ogre_01.zip


Comentários (58)
  • Vinícius Godoy de Mendonça
    avatar

    Sensacional o artigo, vou até ver se me animo a estudar um pouco mais da Ogre. ;)

  • Kleber Andrade
    avatar

    Muito bom mesmo, concordo com o Vini...
    No meio do ano volto a estudar Ogre e tentar fazer pequenos jogos remakes.
    Parabéns,

  • Bruno Crivelari Sanches
    avatar

    É pessoal vale a pena mesmo estudar, é muito boa e o código é uma coleção de boas práticas para o uso do C++.

  • Jonathan
    avatar

    Tem conceitos muito legais que são aplicadas no ogre, a parte de factory é muito bem feita, a api em geral é muito intuitiva, a parte de material e particulas eu pessoalmente gosto muito, e principalmente é open source é multi-plataforma

  • Doom_loko  - Codigo
    avatar

    Na boa , um código deste tamanho so pra aparecer um avião!! faz isso no unty que pq e bem mas light e poderoso

    é a minha opinião .. o site ta de parabens

  • Vinícius Godoy de Mendonça
    avatar

    Ocorre que o Ogre é apenas o motor gráfico. Existem engines que usam a Ogre e possuem o editor visual da cena.

    De qualquer forma, gosto de artigos assim pq explicam o conceito. E mesmo na Unity (que é mesmo sensacional), você precisará entender como o Scene Graph funciona para fazer scripts mais avançados.

  • Bruno Crivelari Sanches
    avatar

    Não é uma comparação muito justa pois o Unity é um engine de jogo e praticamente um "game maker", já o Ogre é um motor gráfico.

    A diferença é que tudo isso feito no exemplo do artigo o Unity cuida para você e se encarrega de criar nodes, configurar traansformações e etc quando você arrasta um objeto para dentro da cena.

  • Jonathan Araujo
    avatar

    Obrigado pelo comentário, só para complementar o que o Bruno falou, existem Game engines usando o Ogre como engine gráfica, que se tornam tão fáceis quanto o Unity como por exemplo a NeoAxis http://www.neoaxisgroup.com/, ou, por exemplo, você pode usar um editor junto com o Ogre que ajuda bastante, como o Ogitor http://www.ogitor.org/HomePage . Opnião pessoal eu gosto de escolher as bibliotecas que eu vo trabalhar, algo que fica ruim em engines como o Unity

  • Andre Carlos  - re: Codigo
    avatar
    Doom_loko Escreveu:
    Na boa , um código deste tamanho so pra aparecer um avião!! faz isso no unty que pq e bem mas light e poderoso

    é a minha opinião .. o site ta de parabens

    O problema da nova geração e que quer tudo na mão ja feito, com isso falta conhecimento, usa uma ferramenta que nao sabe o que ela esta fazendo.

    Bem parabens pelo artigo, esta bem explicado ;).

  • Treco  - Muito Bom
    avatar

    Parabéns pelo artigo!
    -
    Ficou ótima a explicação de uso do Ogre3D!

  • Jonathan Araujo
    avatar

    Obrigado.

    Fique ligado no portal, que virão próximos artigos, cada vez mais práticos, e principalmente voltado ao desenvolvimento de jogos.

  • Jonathan Araujo  - Observação
    avatar

    O diretório:
    PATH=$(OGRE_HOME)\build\bin\debug

    Dependendo da versão do Ogre que você utilize pode não existir então recomendo trocar para:
    PATH=$(OGRE_HOME)\bin\debug

    A mesma coisa deve ser feita para os diretório \release

  • Kaio
    avatar

    Parabens pelo otimo artigo mais to com um probleminha

    quando eu tento rodar o programa no vc++ acusa um erro dizendo que nao pode se achar "OgreMain_d.dll" alguem poderia ajudar ?

  • Bruno Crivelari Sanches
    avatar

    A ultima parte do artigo "Compilando o Exemplo" trata exatamente deste problema. Veja se configurou corretamente o visual como é indicado no artigo.

    T+

  • gabriel  - Duvida linux vs windows
    avatar

    Eu uso linux .. tem alguma diferença nos comando que vc passou acima...

  • Bruno Crivelari Sanches
    avatar

    O código fonte é o mesmo, já o processo de configuração muda um pouco.

    Qual comando especificamente?

    T+

  • Neto  - Linux
    avatar

    Cara da um trabalho, vai na ogre.cfg e muda pra opengl logo acima.

    Na plugin.cfg

    tem la "pluginFolder", poem la "/usr/lib/OGRE/" essa é a pasta q tem os plugins na maioria das distros.

    tira o Vsinc e o outro q começa com esse nome do ogre.cfg, aki ele não reconhece essa, tira o fullscreen tbm, se não sera tenso fexar a janela ja q não vi tratamento de imput.

  • Anônimo  - No MAC
    avatar

    Fala Jonathan... estou tendo problemas quanto a utilização no MAC... teria como me ajudar? na parte de dialogo, para criar a tela... da erro

  • Bruno Crivelari Sanches
    avatar

    Sem ao menos dizer que tipo de erro é:
    Compilação?
    Execução?
    Linker?

    E dependendo do caso, qual a mensagem de erro que aparece, é quase impossível ajudar.

    T+

  • Anônimo
    avatar

    Quando abre a janela da configuracao para q eu possa escolher a resolucao e tudo mais, assim q eu clico em qualquer coisa, o programa aborta...

  • Bruno Crivelari Sanches
    avatar

    Provavelmente o Ogre esta lançando uma exceção, rode em modo debug e descubra o que ele esta lançando, certamente a descrição da exceção já vai ser suficiente para entender o erro.

    Se não souber como usar o debug, veja aqui: http://www.pontov.com.br/site/cpp/41-visual-c/216-como-usar-o-depurado r-do-visual-c

  • Rafael Nunes  - An exeception has occured!
    avatar

    E aew gente, voltei com ogre, tinha me distanciado para fazer meu curso de JSE.

    Compilei e executei o programa standart do ogre que vem no app_wizard !

    Apareceu a cara do ogro e tals, com o quadro de FPS.

    Quando fui tentar compilar esse código abre a tela, só que da um erro de execução que é abortado na hora.

    Código abaixo:

    OGRE EXCEPTION(6:FileNotFoundException): cannot locate resource robot.mesh in resource group Autodetect or any other group. in ResourceGroupManager::openResource at ..\..\..\..\Ogremain\src\OgreResourceGroupMana ger.cpp (line 753)


    me ajudem?

  • Bruno Crivelari Sanches
    avatar

    A mensagem da exception já diz claramente qual foi o problema: o arquivo robot.mesh não foi encontrado.

    Com isso pergunto:
    * A pasta onde o programa é executado contém esse arquivo?
    * Se você rodou pelo visual, configurou corretamente o diretório de execução como foi descrito no artigo?

  • Victor Hugo Viana  - Duvida.
    avatar

    Esyou com uma duvida nessa linha:

    Código:
    Ogre::Entity* entity = mSceneMgr->createEntity( enityNames[randomMeshPosition], enityNames[randomMeshPosition].append(".mesh";));


    É uma duvida sobre C++ em si e não a ogre.
    Sou acostumado com linguagens mais high(Python,C#),sei apenas o basico de C++, bem , esse "Ogre::Entity*",é criado um ponteiro para entity, que aponta para "mSceneMgr->createEntity", esse ogre::entity, adiciona funções da entidade na classe mSceneMgr?

  • Bruno Crivelari Sanches
    avatar

    O ponteiro não aponta para "mSceneMgr->createEntity", ele apenas recebe o valor retornado pelo método, que é um ponteiro para um objeto do tipo Entity.

    Nessa parte não tem grandes diferenças do C#, onde é comum também ter metodos retornando instancias de objetos.

    T+

  • Victor Hugo Viana  - Obrigado.
    avatar

    Obrigado cara,C# eu também só aprendi o básico,Python é a linguagem que eu mais usei(uso),pois uso ela com a BGE(Blender Game Engine),
    Mais uma duvida,dps dessa pretendo não mais encher vcs:

    Código:
    mSceneMgr->getRootSceneNode()->createChildSceneNode( "cenarioNode";)


    Nessa linha de código:
    mSceneMgr = Ponteiro para a classe SceneManager
    Até ai tudo bem, só não entendo como é possivel uma função dentro de outra? Ou seria uma classe dentro de outra?,pelos testes que fiz,não é possivel fazer uma classe que faça funções para outras classes(não tenho certeza),alguém pode explicar?

  • Bruno Crivelari Sanches
    avatar

    É apenas encadeamento de chamadas, ele poderia ter feito:

    Código:

    SceneNode *node = mSceneMgr->getRootSceneNode();
    node->createChildSceneNode("cenarioNode" ) ;

    Ficou mais claro? :)

  • Victor Hugo Viana  - Obrigado de novo.
    avatar

    Com certeza agora dá pra entender rsrs, obrigado por responder minhas perguntas de iniciante.
    Fui...

  • Bruno Crivelari Sanches
    avatar

    Fico feliz que tenha ficado claro agora! T+

  • Anônimo
    avatar

    gostei muito do ogre mais queria iniciar no 2D sabe algum tutorial tipo carregar sprites e criar animações?

  • Vinícius Godoy de Mendonça
    avatar

    Nesse caso, você pode usar a GameSpaceLib:
    http://www.pontov.com.br/site/cpp/64-gs2

    Ou a SDL:
    http://www.lazyfoo.net/SDL_tutorials/
    http://www.sdltutorials.com/

    Ou ainda a Allegro:
    http://equipe.nce.ufrj.br/adriano/c/apostila/allegro/docs/allegro.html

  • Anônimo
    avatar

    Mas tipo oq eu aprender no OPENGL/SDL eu posso utilizar no Ogre?

  • Bruno Crivelari Sanches
    avatar

    Dai não vale a pena usar ogre, pois ele vai encapsular toda a parte de OpenGL.

  • Victor Hugo Viana Santos
    avatar

    Já pensaram em abrir um chat pro pessoal entrar, sanar duvidas, conversar sobre o conteudo daqui?
    Eu acharia uma boa, principalmente se fosse no IRC.

  • Anônimo
    avatar

    Victor,

    pode ser usado a própria área de comentários daqui do site e temos experimentado também um grupo no facebook: https://www.facebook.com/groups/338131602939964/

  • Anônimo
    avatar

    tenho um problema na função main

  • Anônimo
    avatar

    SE você ao menos incluir a mensagem de erro do compilador e o código com erro em algum lugar (tipo codepad.org) podemos lhe ajudar.

  • Carlos  - Pergunta
    avatar

    Desculpe a ignorância, mas o ogre 3D aceita quais extensões de modelagem? Digamos que eu esteja no 3D Studio Max tenho que exporta como para carregar no ogre.

  • Anônimo
    avatar

    De certa forma nenhuma, o que existem são exportadores para diversas ferramentas que exportam o arquivo modelado para o formato que o Ogre reconhece, o que é a técnica mais comum na maioria dos motores.

  • Paulo Vinícius  - Mensagem de Erro ao executar aplicação
    avatar

    No log da aplicação esta gerando o seguinte erro:

    10:59:55: OGRE EXCEPTION(6:FileNotFoundException): Cannot locate resource DualQuaternion.cg in resource group Popular or any other group. in ResourceGroupManager::openResource at ..\..\..\..\OgreMain\src\OgreResourceGroupMana ger.cpp (line 756)
    10:59:55: High-level program Ogre/DualQuaternionHardwareSkinningTwoWeightsCg encountered an error during loading and is thus not supported.
    OGRE EXCEPTION(6:FileNotFoundException): Cannot locate resource DualQuaternion.cg in resource group Popular or any other group. in ResourceGroupManager::openResource at ..\..\..\..\OgreMain\src\OgreResourceGroupMana ger.cpp (line 756)
    10:59:55: OGRE EXCEPTION(2:InvalidParametersException): Named constants have not been initialised, perhaps a compile error. in GpuProgramParameters::_findNamedConstantDefinition at ..\..\..\..\OgreMain\src\OgreGpuProgramParams. cpp (line 1441)
    10:59:55: Compiler error: invalid parameters in DualQuaternion.program(14): setting of constant failed
    10:59:55: OGRE EXCEPTION(6:FileNotFoundException): Cannot locate resource DualQuaternion.cg in resource group Popular or any other group. in ResourceGroupManager::openResource at ..\..\..\..\OgreMain\src\OgreResourceGroupMana ger.cpp (line 756)
    10:59:55: High-level program Ogre/DualQuaternionHardwareSkinningTwoWeightsTwoPhaseCg encountered an error during loading and is thus not supported.
    OGRE EXCEPTION(6:FileNotFoundException): Cannot locate resource DualQuaternion.cg in resource group Popular or any other group. in ResourceGroupManager::openResource at ..\..\..\..\OgreMain\src\OgreResourceGroupMana ger.cpp (line 756)
    10:59:55: OGRE EXCEPTION(2:InvalidParametersException): Named constants have not been initialised, perhaps a compile error. in GpuProgramParameters::_findNamedConstantDefinition at ..\..\..\..\OgreMain\src\OgreGpuProgramParams. cpp (line 1441)
    10:59:55: Compiler error: invalid parameters in DualQuaternion.program(28): setting of constant failed
    10:59:55: OGRE EXCEPTION(6:FileNotFoundException): Cannot locate resource DualQuaternion_Common.glsl in resource group Popular or any other group. in ResourceGroupManager::openResource at ..\..\..\..\OgreMain\src\OgreResourceGroupMana ger.cpp (line 756)

  • Anônimo
    avatar

    Na primeira mensagem já diz o problema:
    Cannot locate resource DualQuaternion.cg

    O arquivo esta em um local que o Ogre possa encontrar? Esta em algum local que o gerenciador de recursos sabe?

  • Paulo Vinícius
    avatar

    Esse arquivo tem que esta na mesma pasta do executável.
    Se for ele já esta?

  • Anônimo
    avatar

    Não precisa necessariamente estar na mesma pasta do executável, tem que estar em algum resource location que o Ogre conheça (veja as chamadas a addResourceLocation no codigo exemplo).

  • Paulo Vinícius
    avatar

    Agora existe um trecho do log que apresenta o seguinte erro

    13:54:15: Parsing scripts for resource group Popular
    13:54:15: Parsing script DualQuaternion.program
    13:54:15: OGRE EXCEPTION(7:InternalErrorException): Unable to compile Cg program Ogre/DualQuaternionHardwareSkinningTwoWeightsTwoPhaseCg: The compile returned an error.
    DualQuaternion_Common.cg(167) : warning C7019: "blendWgt" is too large for semantic "BLENDWEIGHT", which is size 1
    (0) : error C6007: Constant register limit exceeded; more than 96 constant registers needed to compiled program
    (0) : error C6007: Constant register limit exceeded; more than 96 constant registers needed to compiled program
    (0) : error C6007: Constant register limit exceeded; more than 96 constant registers needed to compiled program
    (0) : error C6007: Constant register limit exceeded; more than 96 constant registers needed to compiled program
    (0) : error C6007: Constant register limit exceeded; more than 96 constant registers needed to compiled program
    (0) : error C6007: Constant register limit exceeded; more than 96 constant registers needed to compiled program
    (0) : error C6007: Constant register limit exceeded; more than 96 constant registers needed to compiled program
    (0) : error C6007: Constant register limit exceeded; more than 96 constant registers needed to compiled program
    in CgProgram::compileMicrocode at ..\..\..\..\..\PlugIns\CgProgramManager\sr c\OgreCgProgramManagerDll.cpp (line 67)
    13:54:15: High-level program Ogre/DualQuaternionHardwareSkinningTwoWeightsTwoPhaseCg encountered an error during loading and is thus not supported.
    OGRE EXCEPTION(7:InternalErrorException): Unable to compile Cg program Ogre/DualQuaternionHardwareSkinningTwoWeightsTwoPhaseCg: The compile returned an error.
    DualQuaternion_Common.cg(167) : warning C7019: "blendWgt" is too large for semantic "BLENDWEIGHT", which is size 1
    (0) : error C6007: Constant register limit exceeded; more than 96 constant registers needed to compiled program
    (0) : error C6007: Constant register limit exceeded; more than 96 constant registers needed to compiled program
    (0) : error C6007: Constant register limit exceeded; more than 96 constant registers needed to compiled program
    (0) : error C6007: Constant register limit exceeded; more than 96 constant registers needed to compiled program
    (0) : error C6007: Constant register limit exceeded; more than 96 constant registers needed to compiled program
    (0) : error C6007: Constant register limit exceeded; more than 96 constant registers needed to compiled program
    (0) : error C6007: Constant register limit exceeded; more than 96 constant registers needed to compiled program
    (0) : error C6007: Constant register limit exceeded; more than 96 constant registers needed to compiled program
    in CgProgram::compileMicrocode at ..\..\..\..\..\PlugIns\CgProgramManager\sr c\OgreCgProgramManagerDll.cpp (line 67)
    13:54:15: OGRE EXCEPTION(2:InvalidParametersException): Named constants have not been initialised, perhaps a compile error. in GpuProgramParameters::_findNamedConstantDefinition at ..\..\..\..\OgreMain\src\OgreGpuProgramParams. cpp (line 1441)
    13:54:15: Compiler error: invalid parameters in DualQuaternion.program(28): setting of constant failed

  • Anônimo
    avatar

    Agora são erros de compilação no arquivo cg, tem que corrigir os erros.

  • Paulo Vinícius
    avatar

    Consegue resolver o problema. Deixei na pasta media, somente os arquivos necessários, desta forma não precisou utilizar o arquivo DualQuaternion_Common.cg

    Obrigado pela atenção. O site está de parabéns

  • Anônimo
    avatar

    Obrigado Paulo!

  • Rick  - Problemas para rodar o exemplo
    avatar


    olá senhor Jonathan Araujo.
    estou tendo muita dificuldade em rodar o exemplo 1 no visual studio 2010.
    já fiz o tutorial de instalação com toda a atenção do mundo mais mesmo assim não obtive sucesso algum.
    quando tento executar o exemplo ele dá o seguinte error:

    1>------ Rebuild All started: Project: pontov_tutorial_01, Configuration: Debug Win32 ------
    1> Tutorial1.cpp
    1>c:\ogresdk_vc10_v1-8-1\include\ogre\threading\og rethreadheadersboost.h(37): fatal error C1083: Cannot open include file: 'boost/thread/tss.hpp': No such file or directory
    ========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

    se puder me ajudar ficarei grato
    atenciosamente
    Rick

  • Anônimo
    avatar

    O Ogre já deveria incluir a boost e não deveria dar problemas quanto a isso, mas em todo o caso temos um tutorial que mostra como instalar a boost: http://www.pontov.com.br/site/index.php/cpp/41-visual-c/293-compilando -a-boost-com-visual-c-versao-2010

  • Leonardo Rodrigues  - Ajuda
    avatar

    Não estou conseguindo rodar o exemplo no visual studio 2012...
    ele abre uma janela preta e dá o erro "OGRE EXCEPTION(6:FileNotFoundException): Cannot locate resource penguin.mash in resource group Autodetect or any other group. in ResourceGroupManager::openResource at ..\..\..\..\OgreMain\src\OgreResourceGroupMana ger.cpp (line 756)"

    segui o tutorial de instalação no visual studio 2010...
    Alguém dá uma ajuda ae?!

  • Anônimo
    avatar

    A mensagem de erro já diz tudo: o programa não encontrou o arquivo "penguin.mash", verifique o diretório de execução do programa e a localização do arquivo.

    E se você observar bem a mensagem, vai notar que qualquer arquivo de malha do ogre geralmente possui a extensão "mesh" e não "mash", me parece que você errou no nome do arquivo.

  • Leonardo Rodrigues  - Ajuda²
    avatar

    Hum, consegui arrumar o erro aqui, mas agora tá rodando em preto e branco, sabe oque pode estar de errado? vlw

  • Anônimo
    avatar

    Você quer dizer que o objeto ficou branco? Provavelmente não conseguiu encontrar o material, dai ele fica branco. Veja no log que foi gerado, lá deve ter diversas mensagens de erro sobre o material.

  • Alex Miranda  - Ajuda - Stereoscopia
    avatar

    Sou iniciante com o Ogre e estou desenvolvendo um projeto para a faculdade com o Ogre, porém estou encontrando dificuldades para criar stereoscopia já que a ideia é trabalhar com cena em 3D. Alguém sabe como posso começar? Porque os materiais básicos do site oficial não ajudam muito

  • Anônimo
    avatar

    Recomendo consultar o forum oficial do Ogre (que você acha no site oficial) e ver se por lá, ninguém já teve essa mesma dificuldade.

    No mais, como isso é feito em outros projetos? shaders? Se forem apenas shaders, basta criar os mesmos e usar com o Ogre.

  • Alex Miranda
    avatar

    Agradeço pela ajuda, mas resolvi tentar usar a plataforma Vizard que o suporte é extensivamente maior para as aplicações. Até deixo em aberto aqui para utilizarem no pontoV, a qualidade do software é mt boa e é programada em Python.

  • pepe
    avatar

    Tem pouco tempo que encontrei este site,
    mas a verdade tem que ser dita, em busca de conhecimento
    por motor de jogos e mídia digital.
    Até agora pra mim, este esta sendo o numero 1 !!! O único
    que realmente posta conteúdo de qualidade, um grande abraço a todos
    e continuem sempre assim. Obrigado!

  • Cleber
    avatar

    Olá,
    Primeiramente parabéns pelo trabalho! Ficou muito bom.
    Eu estou tendo problemas para configurar o projeto.
    Estou usando o Ubuntu 16.04, o CodeBlocks 16.01 e o ogre 1.9 que foi instalado via PPA.
    Mesmo com todos os diretórios e arquivos setados eu não consigo compilar...


    "||=== Build: Release in Teste_Ogre (compiler: GNU GCC Compiler) ===|
    ||error: ld returned 1 exit status|
    ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 3 second(s)) ===|
    "


    Entendo que o erro é provavelmente no Linker, mas não faço ideia de como resolver.
    Existe algum passo-a-passo de como configurar um projeto no C:B usando o ubuntu? Eu já procurei bastante e só acho pra Windows.

    Grato desde já!

Escrever um comentário
Your Contact Details:
Gravatar enabled
Comentário:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):S:!::?::idea::arrow:
Security
Por favor coloque o código anti-spam que você lê na imagem.
LAST_UPDATED2  

Busca

Linguagens

Twitter