Este blog esta em reforma no momento.

Ajustando a Camera

O jogo vai contar com um sistema de camera composto por 4 cameras:
Uma de visão em primeira pessoa para visão dos espaços;
Uma ortogonal que mostra o plano geral como num RPG normal;
Uma "livre" para os cinematics;
Cameras gerais fixas no cenário, para alternar ângulos dramáticos.

De início ja montei as duas principais, baseando-me no exemplo da própria GameKit.
O sistema é basicamente assim: são inseridos dois objetos vazios (emptys) no espaço global.
O objeto que fará revolução no eixo X (vermelho) é conectado ao objeto que fará revolução no eixo Z.

A camera é conectada ao objeto do eixo X e praticamente faz o movimento de 360 graus em todos os lados. Esta é a camera de primeira pessoa e fornece uma visão em perspectiva ótima para o jogador observar as coisas do ângulo do personagem, observar inimigos e mirar com armas de mão.

Outra camera é conectada ao objeto do eixo Z e sofre apenas rotação neste eixo, como a camera do Ragnarok. Esta camera também difere da outra porque esta usando pojeção ortogonal.

Tradução para leigos
Esta imagem acima esta usando a projeção em perspectiva,  as linhas retas vão se aproximando umas das outras conforme vão se distanciando da camera.
Já a projeção ortogonal isso não acontece, é um meio de visão usado para estudos técnicos e muito comum essa visão em jogos que não usavam 3D, mas um 2D que permitisse a visão tridimensional.

Isto  produz umas diferenças de como as cameras se comportam no caso do zoom. A camera em perspectiva basta eu aproximar ou afastar do personagem, já a ortogonal é indiferente à distância dos objetos assim para dar o zoom nela eu preciso mudar a escala da camera.

Permutar entre os sistemas de camera sera um ponto que espero que agrade e aumente a jogabilidade. Bom, eu sempre me pego querendo uma visão mais introspectiva em jogos como Mu Online, Warcraft 3 e Diablo por isso espero que outros jogadores também queirão o mesmo.

Programando a malvada
Pegar o modelo da GameKit e expandir foi fácil, mais dificil foi implementar as funções extras.

No começo bastou pegar a cena corrente e nela a camera corrente e mudar seu modo de projeção. Isso apenas no C++ pois a engine não oferecia essa função em tempo de execução.

Ai tive uns probleminhas ao trocar de camera, pois toda vez que eu mudava a forma de projetar a matriz de visão era reiniciada e perdia o "aspect ratio" da tela. Deixando a imagem bem distorcida.

Após isso tive que ter o cuidado de recalcular o "aspect ratio". Isso é feito dividindo-se a largura da janela pela altura. Esse valor é injetado na matriz de visão para corrigir a distorção visual.
int WWP_Ex::setProjectionType( lua_State* L)
{
 int stack = lua_gettop(L);
 if (stack>0 && lua_isstring(L,1))
 {
  bool perspective = true;
  char type = ((const char*) lua_tostring(L,1))[0];
  if (type=='o' || type=='O')
   perspective = false;
  gkScene* scene = gkEngine::getSingleton().getActiveScene();
  gkCamera* camera;
  if(scene)
   camera = scene->getMainCamera();

  if (camera)
   if (perspective)
    camera->setProjType( gkCameraProperties::CA_PERSPECTIVE );
   else {
    camera->setProjType( gkCameraProperties::CA_ORTHOGRAPHIC );
   }
  Ogre::Real ratio = (double) scene->getDisplayWindow()->getWidth() / (double) scene->getDisplayWindow()->getHeight();
  scene->getDisplayWindow()->getViewport(0)->getViewport()->getCamera()->setAspectRatio(ratio);
 }
}

Comentários