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
