terça-feira, 6 de outubro de 2009

Iniciante 02 - Entity e SceneNode [Tutorial]

Posted on 16:17 by Marcelo

Olá, como vão vocês?

Bom nesta aula iremos falar sobre os dois objetos, acho que, mais utilizados quando trabalhamos com ogre 3d, são eles a entity e o scene node. Em primeiro lugar vamos entender como uma engine mostra um objeto na tela. Para exibir um objeto na tela é carregado um arquivo que contem as informações sobre verticies, malha e textura, esses comandos são carregados pela engine e execultados fazendo com que ele seja exibido, no ogre 3d não é tão diferente, nele os objetos 3d são compostos por três parte principais: entity, scene node e skeleton.

A entity (entidade) é a parte do objeto que armazena as informações da malha, é essa que o ogre vai exibir na tela, por outro lado o scene node (nó de cena) é a parte desse objeto que armazena as informações do tamanho, posição e varias outras coisas.

Um exemplo de entidade pode ser uma casa, uma arvore, um personagem... Outros objetos que parecem ser entidades como luzes, camera, particulas são na verdade um tipo de nó de cena.
As entidades são criadas pela função createEntity do método SceneManager onde seu primeiro parâmetro é o nome da entidade e o segundo o nome da malha a ser usada, essa no ogre 3d possue o formato .mesh e pode ser convertida com os principais modeladores como o 3d studio max e blender com exportadores disponibilizados na pagina do ogre 3d.

Por exemplo se eu quiser cria uma entidade com o nome robo usando a malha robot.mesh basta eu usar: Ogre::Entity* ent1 = mSceneMgr->createEntity("robo","robot.mesh"); onde mSceneMgr é o meu objeto do metodo Scene Manager. Neste caso o arquivo de malha robot.mesh deve estar contido no nosso resource group que estudaremos adiante, ainda sim se este objeto for animado, isto é, possuir um esqueleto (bones), ao exportar o seu arquivo além do .mesh será criado um chamado .skeleton este possui as informações sobre os bones e a animação da entidades, lembrando que este é carregado automaticamente ao criar uma entidade.

Os Scene Nodes são como disse anteriormente ponteiros que armazenam posição, tamanho e outra informações sobre a entidade, na verdade esse conceito é um pouco limitado visto que o Scene Node também suporta outros objetos além de entidades como cameras, luzes, particulas e até mesmo outro scene node. Para ser criado um Scene Node dever ser "filho" ou "child" de outro scene node, ao criar-se um objeto para o metodo Scene Manager um scene node padrão é criado e ele pode ser retornado pela função getRootSceneNode() do metodo Scene Manager, e para criar um scene node filho utiliza-se a função creatChildSceneNode() do método Scene Node. Você deve estar confuso, para entender melhor vejamos o exemplo abaixo que cria um Scene Node filho do scene node principal:
Ogre::SceneNode* node = mSceneMgr->getRootSceneNode()->createChildSceneNode("nome");
Como é possivel perceber todo scene node de ser filho de outro, todos os scene nodes que não necessitem necessariamente ser filho de outro deve ser criado como filho do scene node principal. É possível também criar um filho pra um scene node que é filho de outro e por ai vai, mas não necessitamos disso por enquanto, apenas precisamos saber o basico sobre eles.

Para uma entidade poder ser totalmente criada devemos relacionar ela a um scene node, caso contrario ela não vai ser inciada e portanto não aparecerá na tela. Agora precisamos de uma informação muito importante, se os scene nodes vão armazenar os dados da entidade, como relacionamos um ao outro? Sempre que quiser-mos relacionar um scene node a outro objeto usamos a função attachObject() do método Scene Node, neste caso para que a entidade do nosso exemplo pudesse aparecer teriamos que relaciona-la a o nosso objeto node para isso faria-mos:
node->attachObject(ent1);

Por hoje é só, agora nós ja podemos criar entidades e exibi-las na tela. Sintetisando tudo temos:

  • Entity (Entidade) - Parte do objeto 3d que cuida da malha.
  • Scene Node - Armazena os dados do objeto relacionado a ele.
  • Tendo que mSceneMgr é um objeto do método Scene Manager: mSceneMgr->createEntity("nome","arquivo_da_mesh.mesh") cria uma entidade
    mSceneMgr->getRootSceneNode()->createSceneNode("nome") cria um scene node nome filho do scene node principal.
  • Tendo que mNode é um objeto contendo um scene node filho do scene node principal e mEnt um objeto contendo uma entidade:
    mNode->attachObject(mEnt); relaciona a entidade mEnt ao scene node mNode.

Até a próxima!

2 comentários:

  1. Æ!!

    Bem legal o artigo cara! Continue postando! :D

    Há braços

    ResponderExcluir
  2. Olá,

    Sou Paulo Coutinho, dono do portal DevGames(devgames.com.br) e estou te convidando a postar seus tutoriais de Ogre3D para nossos leitores, se possível.

    Desde já agradeço.

    E parabéns pelos tutoriais, estão excelentes.

    Atenciosamente,
    Paulo Coutinho.

    ResponderExcluir