Olá pessoal, td bem com vocês?
Bom neste tutorial iremos aprender a manipular sombras e luzes com ogre 3d, algumas pessoas me pediram para dar exemplos praticos durante as aulas e acaterei o pedido dessas pessoas apartir deste tutorial.
Antes de começar a falar sobre luzes e sombras eu vou ensinar como incializar o ogre pela classe de exemplos que o ogre disponibiliza, porém esta classe é limitada e serve apenas para demostrações e portanto servirá para o nosso tutorial mais tarde eu ensinarei como iniciar o ogre manualmente, o que não nos é necessario por enquanto.
Voltando ao que interessa eu vou supor que você esteja usando o visual c++ express edition e que tenha lido meu tutorial de como instalar e configurar uma aplicação para ogre 3d em visual c++ (aqui). Crie um novo projeto e configure-o para rodar com ogre 3d, no arquivo main.cpp adicione o código :
#include "Ogre.h"
#include "ExampleApplication.h"
class SampleApp : public ExampleApplication
{
public:
SampleApp()
{}
protected:
void createScene(void)
{
Entity* ent = mSceneMgr->createEntity("robot","robot.mesh");
SceneNode* node = mSceneMgr->getRootSceneNode()->createChildSceneNode("robotnode");
node->attachObject(ent);
}
};
int main(int argc, char **argv)
{
SampleApp app;
app.go();
return 0;
}
Supondo também que você leu o tutorial sobre entities e scene nodes você deve saber que as linhas 15, 16 e 17 criam e atacham uma entidade a um node. O resto é responsavel pela incialização pela classe de exemplo, como não precisamos mais que esta classe se você quiser fazer algum teste apenas modifique a função createScene(void).
Agora vamos realmente falar sobras luzes e as sombras:
A luz é um elemento fundamental em jogos 3d, é ela que define o estado do nível, ela pode dar um ar mais "Dark" quanto um ar mais "Light". No ogre 3d as luzes podem ser de três tipos:
Agora vamos a parte prática, adicione na função createScene(void) o código seguinte:
Light* light0 = mSceneMgr->createLight("Light0");
light0->setType(Light::LT_POINT);
light0->setPosition(Vector3(0,1500,0));
A função createLight() como já vimos cria a luz, o método setType() é responsavel por definir o tipo da luz nesse caso Point e setPosition() define posição da luz no mundo 3d.
Agora adicione isso:
light0->setDiffuseColour(0.0, 0.0, 1.0);
light0->setSpecularColour(0.0, 0.0, 1.0);
Nesse caso nós alteramos a cor de reflexão difusa e especular da nossa luz. As luzes directional e spot light funcionam quase desta forma, não vou exemplifica-las aqui mas você pode testar as seguintes funções na sua luz (sempre mudando o tipo):
light0->setDirection(Vector3(0,-1,1)); //define a direção pra -1 no eixo y e 1 no eixo \
light0->setDirection(Vector3(-1,-1,0)); //define a direção pra -1 no eixo x e -1 no eixo y
light0->setSpotLightRange(Degree(70),Degree(150)); //determina o raio do emisor ou do inicio como 70 graus e o raio do receptor ou final em 150 graus.
Sobre luz é só isso. Agora que ja estudamos luz e ja temos uma luz padrão no nosso jogo, nos podemos estudar as sombras, então vamos lá:
Sombras são elementos que aumentão o realismo de um jogo, mas para isso requerem mais processamento gráfico, daí em computadores sem placas/adaptadores de video o jogo usando tecnicas avançadas de shadow pode travar constatemente. O ogre possui 6 tipos de sombra mas alguns não são muito usados por isso vamos estudar apenas os principais que são 3:
light0->setCastShadow(true);
mSceneMgr->setShadowTechinique(SHADOWTYPE_TEXTURE_STENCIL);
Plane plane(Vector3::UNIT_Y, 0);
MeshManager::getSingleton().createPlane("ground",ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,plane,1500,1500,0,0,true,1,5,5,Vector3::UNIT_Z);
Entity *entPlano = mSceneMgr->createEntity("chao","ground");
SceneNode *nodePlano = mSceneMgr->getRootSceneNode()->createChildSceneNode("chaoNode");
nodePlano->attachObject(entPlano);
entPlano->setMaterialName("Examples/Rockwall");
ent->setCastShadow(true);
Não se preocupe com os codigos das linhas 3 à 7, eles apenas criam um chão a qual vai receber as sombras para nós podermos visualiza-la. Assim finalizamos nossa aula de hoje, compile o código e teste as sombras e a iluminação, até a próxima!
Bom neste tutorial iremos aprender a manipular sombras e luzes com ogre 3d, algumas pessoas me pediram para dar exemplos praticos durante as aulas e acaterei o pedido dessas pessoas apartir deste tutorial.
Antes de começar a falar sobre luzes e sombras eu vou ensinar como incializar o ogre pela classe de exemplos que o ogre disponibiliza, porém esta classe é limitada e serve apenas para demostrações e portanto servirá para o nosso tutorial mais tarde eu ensinarei como iniciar o ogre manualmente, o que não nos é necessario por enquanto.
Voltando ao que interessa eu vou supor que você esteja usando o visual c++ express edition e que tenha lido meu tutorial de como instalar e configurar uma aplicação para ogre 3d em visual c++ (aqui). Crie um novo projeto e configure-o para rodar com ogre 3d, no arquivo main.cpp adicione o código :
#include "Ogre.h"
#include "ExampleApplication.h"
class SampleApp : public ExampleApplication
{
public:
SampleApp()
{}
protected:
void createScene(void)
{
Entity* ent = mSceneMgr->createEntity("robot","robot.mesh");
SceneNode* node = mSceneMgr->getRootSceneNode()->createChildSceneNode("robotnode");
node->attachObject(ent);
}
};
int main(int argc, char **argv)
{
SampleApp app;
app.go();
return 0;
}
Supondo também que você leu o tutorial sobre entities e scene nodes você deve saber que as linhas 15, 16 e 17 criam e atacham uma entidade a um node. O resto é responsavel pela incialização pela classe de exemplo, como não precisamos mais que esta classe se você quiser fazer algum teste apenas modifique a função createScene(void).
Agora vamos realmente falar sobras luzes e as sombras:
A luz é um elemento fundamental em jogos 3d, é ela que define o estado do nível, ela pode dar um ar mais "Dark" quanto um ar mais "Light". No ogre 3d as luzes podem ser de três tipos:
- Point - Luz que ilumina em todas as direções, no struct de luzes do ogre é representada por LT_POINT.
- Spotlight - Esse tipo de luz é otimo para criar luzes com direção definida com curto alcance com por exemplo uma lanterna ou farol de carro, no ogre é representada por LT_SPOTLIGHT.
- Directional - Esse tipo de luz serve para criar luzes com certa direção e de longo alcance e é muito utilizada para simular a luz do sol ou da lua, no ogre representada por LT_DIRECTIONAL.
Agora vamos a parte prática, adicione na função createScene(void) o código seguinte:
Light* light0 = mSceneMgr->createLight("Light0");
light0->setType(Light::LT_POINT);
light0->setPosition(Vector3(0,1500,0));
A função createLight() como já vimos cria a luz, o método setType() é responsavel por definir o tipo da luz nesse caso Point e setPosition() define posição da luz no mundo 3d.
Agora adicione isso:
light0->setDiffuseColour(0.0, 0.0, 1.0);
light0->setSpecularColour(0.0, 0.0, 1.0);
Nesse caso nós alteramos a cor de reflexão difusa e especular da nossa luz. As luzes directional e spot light funcionam quase desta forma, não vou exemplifica-las aqui mas você pode testar as seguintes funções na sua luz (sempre mudando o tipo):
- Para Directional:
light0->setDirection(Vector3(0,-1,1)); //define a direção pra -1 no eixo y e 1 no eixo \
- Para SpotLight:
light0->setDirection(Vector3(-1,-1,0)); //define a direção pra -1 no eixo x e -1 no eixo y
light0->setSpotLightRange(Degree(70),Degree(150)); //determina o raio do emisor ou do inicio como 70 graus e o raio do receptor ou final em 150 graus.
Sobre luz é só isso. Agora que ja estudamos luz e ja temos uma luz padrão no nosso jogo, nos podemos estudar as sombras, então vamos lá:
Sombras são elementos que aumentão o realismo de um jogo, mas para isso requerem mais processamento gráfico, daí em computadores sem placas/adaptadores de video o jogo usando tecnicas avançadas de shadow pode travar constatemente. O ogre possui 6 tipos de sombra mas alguns não são muito usados por isso vamos estudar apenas os principais que são 3:
- Modulative Texture Shadows - são sombras borradas e sem muito realismo, na verdade é o tipo de sombra mais simples no ogre e nele é representado por SHADOWTYPE_TEXTUTE_MODULATIVE.
- Modulative Stencil Shadows - é um tipo de sombra bem definido de mais qualidade, algumas pessoas dizem que é o meio termo de sobras no ogre mas particulamente eu acho que esse é o melhor tipo, este é representado por SHADOWTYPE_TEXTURE_STENCIL.
- Aditive Stecil Shadows - esse metodo cria uma sombra para cada light na cena, por isso é considera por muitos o melhor tipo no ogre 3d, neste é representada por SHADOWTYPE_ADITIVE_STENCIL.
light0->setCastShadow(true);
mSceneMgr->setShadowTechinique(SHADOWTYPE_TEXTURE_STENCIL);
Plane plane(Vector3::UNIT_Y, 0);
MeshManager::getSingleton().createPlane("ground",ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,plane,1500,1500,0,0,true,1,5,5,Vector3::UNIT_Z);
Entity *entPlano = mSceneMgr->createEntity("chao","ground");
SceneNode *nodePlano = mSceneMgr->getRootSceneNode()->createChildSceneNode("chaoNode");
nodePlano->attachObject(entPlano);
entPlano->setMaterialName("Examples/Rockwall");
ent->setCastShadow(true);
Não se preocupe com os codigos das linhas 3 à 7, eles apenas criam um chão a qual vai receber as sombras para nós podermos visualiza-la. Assim finalizamos nossa aula de hoje, compile o código e teste as sombras e a iluminação, até a próxima!



, na nova janela escolha C++ file (.cpp) e mude o nome para main.cpp, clique em add:
[/caption]