<< Voltar Índice Próxima >>

MOVIMENTAÇÃO

FPS

Este tutorial é uma continuação deste tutorial da parte intermediária. Então recomenda-se a leitura do outro.

scene_mgr->getSceneNode("roboNode")->translate(
    scene_mgr->getSceneNode("roboNode")->getOrientation() *
        transVector * evt.timeSinceLastFrame);

 

Iremos trocar o trecho de código acima, que está no método frameStarted()...

if(transVector.normalise() !=0){
  transVector = scene_mgr->getSceneNode("roboNode")->getOrientation() * transVector * 250;
  if(transVector.y == 0){
  	transVector.y = transVector.y + roboBody->getLinearVelocity().y; }
  roboBody->setLinearVelocity(transVector);
}

 

...Por este outro. Os valores do vetor transVector são atualizados de acordo com a orientação do robô e dos valores anteriores do vetor. O valor 250 é necessário para que o valor do vetor não seja muito pequeno. Para movimentar o robô não iremos utilizar forças, iremos modificar diretamente o seu momento linear, dessa força outras forças, como a gravidade, não terão influência significativa sobre o robô enquanto modificarmos o momento linear.

Dessa forma teremos que atualizar o valor das forças sobre o robô no eixo Y forçadamente. Cabe salientar que esse método não garante uma simulação de física adequadamente. Então caso o vetor transVector não esteja sendo modificado por um comando do usuário, seu valor Y será igual a zero, com isso atualizamos o seu valor Y de acordo com a velocidade linear atual do robô.

Observe este trecho de código só será executado se alguma tecla de movimentação foi pressionada, isso acontece quando o vetor transVector é igual a zero. Isso evita que o valor de Y do vetor transVector seja atualizado de forma errada, e consequentemente o robô. Depois disso movimentamos o robô usando a função setLinearVelocity() onde o parâmetro é o vetor que irá determinar a movimentação.

switch(e.key)
{
case OIS::KC_W:
    forward = false;
    roboBody->setLinearVelocity(roboBody->getLinearVelocity() * Vector3(1,1,0));
    break;
case OIS::KC_A:
    left = false;
    roboBody->setLinearVelocity(roboBody->getLinearVelocity() * Vector3(0,1,1));
    break;
case OIS::KC_D:
    right = false;
    roboBody->setLinearVelocity(roboBody->getLinearVelocity() * Vector3(0,1,1));
    break;
case OIS::KC_S:
    back = false;
    roboBody->setLinearVelocity(roboBody->getLinearVelocity() * Vector3(1,1,0));
    break;
case OIS::KC_PGUP:
case OIS::KC_Q:
    up = false;
    roboBody->setLinearVelocity(roboBody->getLinearVelocity() * Vector3(1,0,1));
    break;
case OIS::KC_PGDOWN:
case OIS::KC_E:
    down = false;
    roboBody->setLinearVelocity(roboBody->getLinearVelocity() * Vector3(1,0,1));
    break;

 

Para que o robô pare a sua movimentação devemos zerar a sua velocidade linear na direção em que ele estava se movimentando. Isso realizamos multiplicando a atual velocidade linear do robô por um vetor que seu valor no eixo que devemos parar o movimento do robô, é zero. Com isso os outros eixos sendo multiplicados por 1, não irão impedir a movimentação do robô neles.

Italo Mendes
italo.ribeiro@gmail.com

<< Voltar Índice Próxima >>