• Nenhum resultado encontrado

Controle dos movimentos da pr´otese virtual

4.2 Componentes do Prot´otipo

4.2.3 Pr´otese virtual computadorizada

4.2.3.2 Controle dos movimentos da pr´otese virtual

Depois de realizados alguns testes e verificada a estabilidade do processo de exportac¸˜ao do Blender para o jMonkeyEngine, foram levantados requisitos para o desenvolvimento de um componente em Java Swing que renderizasse a pr´otese mioel´etrica virtual e permitisse seu controle pelos outros componentes do sistema. Os requisitos identificados foram:

a) O componente deve ser um java.awt.Component, ou seja, deve herdar de java.awt.Component direta ou indiretamente, para que possa ser adicionado em outros componentes gr´aficos do Swing.

b) Ele deve isolar o c´odigo que utiliza o jMonkeyEngine para renderizac¸˜ao do restante do sistema, para diminuir o acoplamento e permitir que outras bibliotecas de gr´aficos 3D sejam utilizadas futuramente.

c) Ele deve prover uma interface por meio da qual outros objetos do sistema s˜ao capazes de enviar comandos para a movimentac¸˜ao da pr´otese.

d) Um comando para a realizac¸˜ao de movimento n˜ao dever´a surtir efeito se um movimento j´a estiver sendo realizado.

A fim de atender ao requisito de enviar comandos para a pr´otese mioel´etrica virtual, criou- se a enumerac¸˜ao (enum) Comando, que representa os comandos de movimentos poss´ıveis da pr´otese mioel´etrica. A Listagem 4.1 apresenta a definic¸˜ao dessa enumerac¸˜ao. Nela, apenas 4 movimentos est˜ao enumerados, entretanto, mais movimentos podem ser adicionados em tempo de compilac¸˜ao, para contemplar novas animac¸˜oes acrescentadas ao modelo 3D.

1 public enum Comando {

2 DESVIO_RADIAL("DesvioRadial"), DESVIO_ULNAR("DesvioUlnar"),

FLEXAO_PUNHO(

3 "FlexaoPunho"), HIPEREXTENSAO_PUNHO("HiperextensaoPunho"); 4

5 private final String nome;

6

7 private Comando(String nome) {

8 this.nome = nome;

9 }

10

11 public String getNome() {

12 return nome;

13 }

14 }

As linhas de 2 a 3 definem os movimentos poss´ıveis com seu identificador de nome, que deve corresponder ao nome da action do Blender na qual foi constru´ıda a animac¸˜ao. A vari´avel na linha 5 ´e declarada final porque uma enumerac¸˜ao n˜ao muda seu valor depois de criada. O m´etodo p´ublico definido nas linhas de 11 a 13 fornece um meio de clientes dessa enumerac¸˜ao recuperarem o nome do movimento.

Criou-se ainda uma interface MaoControlavel para representar objetos que ser˜ao controla- dos por comandos. A Listagem 4.2 apresenta sua definic¸˜ao. Ela cont´em apenas um m´etodo, enviarComando(), que recebe uma enumerac¸˜ao Comando, que indica qual comando est´a sendo ativado.

1 public interface MaoControlavel {

2 void enviarComando(Comando com); 3 }

Listagem 4.2 – Interface MaoControlavel

O modelo em Blender exportado ´e carregado por meio de uma extens˜ao da classe Simple- Application do jMonkeyEngine. A Figura 4.12 apresenta o diagrama de classe da classe Mao- Virtual, que herda da classe SimpleApplication, uma classe do jMonkeyEngine que permite o acesso a recursos de gr´aficos 3D, e implementa as interfaces AnimEventListener e MaoContro- lavel. A interface MaoControlavel indica que a classe MaoVirtual poder´a receber comandos aos quais reagir´a com a execuc¸˜ao da animac¸˜ao correspondente. Os comandos s˜ao recebidos pelo m´etodo enviarComando(), que deve ser implementado pela classe MaoVirtual. A interface Ani- mEventListener ´e utilizada para detectar eventos durante uma animac¸˜ao e no escopo da classe MaoVirtual ´e utilizada para detectar o fim de uma animac¸˜ao, de forma a auxiliar no bloqueio de novas animac¸˜oes enquanto uma animac¸˜ao n˜ao tiver sido finalizada. Esse controle de bloqueio de animac¸˜oes ´e feito pela vari´avel de flag estahEmMovimento.

Figura 4.12 – Diagrama de classe da classe MaoVirtual

Por herdar da classe abstrata SimpleApplication, que tamb´em possui um m´etodo abstrato simpleInitApp(), a classe MaoVirtual ´e obrigada a implementar esse m´etodo. Ele ´e o m´etodo

no qual os recursos de gr´aficos 3D s˜ao carregados, como o modelo exportado do Blender e a textura desse modelo. A Listagem 4.3 apresenta a definic¸˜ao desse m´etodo.

1 public class MaoVirtual extends SimpleApplication implements

AnimEventListener, MaoControlavel {

2 ...

3 @Override

4 public void simpleInitApp() {

5 getFlyByCamera().setDragToRotate(true); 6

7 flyCam.setMoveSpeed(20);

8 DirectionalLight dl = new DirectionalLight();

9 dl.setDirection(new Vector3f(-0.1f, -1f, -1).normalizeLocal

()); 10 rootNode.addLight(dl); 11 12 assetManager 13 .registerLocator( 14 Configuracao.getCaminhoModeloMao(), 15 FileLocator.class); 16

17 Spatial mao = assetManager.loadModel("hand.mesh.xml"); 18 Material materialTexturaMao = new Material(assetManager, 19 "Common/MatDefs/Misc/Unshaded.j3md");

20 materialTexturaMao.setTexture("ColorMap",

21 assetManager.loadTexture("Textures/hand_texture.png")); 22 mao.setMaterial(materialTexturaMao);

23

24 AnimControl control = mao.getControl(AnimControl.class); 25 control.addListener(this); 26 channel = control.createChannel(); 27 28 rootNode.attachChild(mao); 29 } 30 ... 31 }

Listagem 4.3 – M´etodo simpleInitApp() da classe MaoVirtual

As linhas de 5 a 7 configuram a cˆamera para girar e sua velocidade. As linhas de 8 a 10 adicionam a iluminac¸˜ao do cen´ario 3D, caso contr´ario nada seria visto. As linhas de 12 a 17 carregam o modelo exportado do Blender. As linhas de 17 a 22 adicionam a textura do modelo

3D de m˜ao. As linhas de 24 a 26 configuram as animac¸˜oes e registram a classe MaoVirtual como uma listener de eventos de animac¸˜ao.

A classe MaoVirtual ainda n˜ao ´e um componente que pode ser adicionado em uma inter- face gr´afica Swing. Dessa forma, torna-se necess´ario criar uma outra classe que encapsule a renderizac¸˜ao da MaoVirtual em um componente reconhecido pelo Swing. A classe desenvol- vida que desempenha esse papel ´e a MaoPanel, que herda diretamente de JPanel e utiliza a classe do jMonkeyEngine JmeCanvasContext para fornecer a renderizac¸˜ao do modelo em um Canvas. A Figura 4.13 apresenta o diagrama de classe da classe MaoPanel. Nele observa-se que MaoPanel herda de JPanel e tem uma associac¸˜ao com uma MaoVirtual. Al´em disso, ela tamb´em implementa a interface MaoControlavel, mas o controle ´e simplesmente delegado `a MaoVirtual com a qual se associa.

Figura 4.13 – Diagrama de classe da classe MaoPanel

O m´etodo chave da MaoPanel ´e o getCanvasMao(), no qual ´e instanciado um objeto MaoVir- tual e ´e extra´ıdo um Canvas que poder´a ser adicionado `a MaoPanel. A Listagem 4.4 apresenta a definic¸˜ao do m´etodo getCanvasMao().

1 public class MaoPanel extends JPanel implements MaoControlavel

{

2 ...

3 private MaoVirtual maoVirtual;

4 private static Application app;

5 private static JmeCanvasContext context;

6 private static Canvas canvas;

7

8 private Canvas getCanvasMao() {

9 AppSettings settings = new AppSettings(true); 10 settings.setWidth(640);

11 settings.setHeight(480);

12 settings.setRenderer(AppSettings.LWJGL_OPENGL1); 13

14 maoVirtual = new MaoVirtual(); 15 app = maoVirtual; 16 17 app.setPauseOnLostFocus(false); 18 app.setSettings(settings); 19 app.createCanvas(); 20 app.startCanvas(true); 21

22 context = (JmeCanvasContext) app.getContext(); 23 canvas = context.getCanvas(); 24 canvas.setSize(settings.getWidth(), settings.getHeight()); 25 26 return canvas; 27 } 28 ... 29 }

Listagem 4.4 – M´etodo getCanvasMao() da classe MaoPanel

As linhas de 9 a 12 criam um objeto de configurac¸˜ao com a dimens˜ao da tela de renderizac¸˜ao do modelo de m˜ao e a vers˜ao do OpenGL utilizada. As linhas de 14 e 15 instanciam e guardam referˆencias para a MaoVirtual. As linhas de 17 a 20 aplicam a configurac¸˜ao preparada anteri- ormente `a MaoVirtual e criam um Canvas para renderizar a MaoVirtual. As linhas de 22 a 26 recuperam uma referˆencia ao Canvas criado para retorn´a-lo do m´etodo.