Tutorial: Utilizando o motor físico Box2D em conjunto com o Cocos2d-x – Parte 5

Conceito de PênduloO nosso sistema articulado está bastante interessante.

Mas temos como incrementá-lo, adicionando um peso na ponta para vê-lo balançando com o impulso do motor.

Bora ver como isso fica?

No tutorial passado nós implementamos um sistema articulado com um motor e dois eixos presos a ele. Vimos também um novo tipo de junta: a junta prismática. Vimos que a junta prismática faz um tipo de “trilho” entre dois corpos rígidos. Nesse tutorial vamos incrementar a estrutura que eu apresentei no tutorial passado. A Figura 1 mostra essa estrutura. Adicionaremos um pêndulo na ponta de um dos eixos para que ele balance, impulsionado pelo motor. Para isso, veremos um novo tipo de junta: a junta de distância.

Figura 1 - Estrutura articulada do motor

Figura 1 – Estrutura articulada do motor

Para quem não lembra o que é uma junta de distância (falei nesse tutorial), ela especifica um ponto em um objeto rígido e outro ponto em outro objeto rígido. Quando é iniciada a simulação física, os pontos desses objetos serão separados sempre pela mesma distância. É uma junta muito boa para simular um pêndulo de relógio, por exemplo. Isso é exatamente o que faremos.

Para adicionar um pêndulo na estrutura mostrada na Figura 1, faz-se necessário criar um círculo que balançará quando o motor começar a girar. Esse círculo será preso na ponta esquerda do Eixo2, de forma que o círculo balance quando o eixo começar a se movimentar. Dessa forma, utilizaremos o mesmo código do tutorial passado. Para adicionar o círculo já no lugar correto, abra o arquivo “HelloWorldScene.cpp” e inclua o seguinte código

b2BodyDef definicaoCorpoPendulo;

definicaoCorpoPendulo.type = b2_dynamicBody;

definicaoCorpoPendulo.position.Set((size.width/2)/PTM_RATIO – 7.5,2.5);

b2Body* corpoPendulo = HelloWorld::world->CreateBody(&definicaoCorpoPendulo);

b2CircleShape geometriaPendulo;

geometriaPendulo.m_radius = 0.8;

b2FixtureDef cascaPendulo;

cascaPendulo.shape = &geometriaPendulo;

cascaPendulo.density = 1.0f;

corpoPendulo->CreateFixture(&cascaPendulo);

logo abaixo da seguinte linha de código

HelloWorld::world->CreateJoint(&definicaoJuntaEixoSustentador);

Se executarmos o aplicativo agora, o círculo que acabamos de criar cairá no chão. É necessário criar uma junta que o interligue ao Eixo2. Para isso, vamos incluir essa junta de distância com um ponto no final no Eixo2 e o outro ponto no centro do círculo que acabamos de adicionar. Finalizando, para adicionar essa junta, inclua o seguinte código logo abaixo do código mostrado anteriormente.

b2DistanceJointDef definicaoJuntaEixoPendulo;

definicaoJuntaEixoPendulo.Initialize

    (corpoEixo2,corpoPendulo,b2Vec2((size.width/2)/PTM_RATIO – 7.5,5),corpoPendulo->GetWorldCenter());

HelloWorld::world->CreateJoint(&definicaoJuntaEixoPendulo);

Compile tudo e veja o resultado. Quando o motor começa a girar, ele põe toda a estrutura articulada em movimento. Estando ela em movimento, o pêndulo que acabamos de adicionar começa a se mexer. Perceba que o círculo sempre fica na mesma distância do final do Eixo2 e, as vezes, chega a dar voltas. Se você quiser ver o resultado, dê uma olhada no vídeo abaixo, que também pode ser acessado aqui.

Nesse tutorial vimos como incrementar mais a nossa estrutura articulada. Vimos também o funcionamento de uma nova junta: a junta de distância. No próximo tutorial vamos deixar essa animação mais parecida com o mundo real e adicionar texturas nos objetos rígidos.

Por hoje é isso pessoal, nos vemos mais para frente. []

Santiago Viertel

Santiago Viertel

Formado em Bacharelado em Ciência da Computação (UDESC), mestre e doutorando em Análise de Algoritmos (UFPR). Foi programador da Céu Games por 8 anos. Possui a preferência por jogos de estratégia e de tiro em primeira pessoa. Jogando bastante DotA 2, Left 4 Dead 2 e Age of Empires II HD.

Send this to a friend