Realidade Virtual Aula 10 Remis Balaniuk Interfaces hápticas • Permitem simular contato físico do usuário com objetos virtuais. • Exige hardware específico. • Demanda alta velocidade de processamento. • Implementação envolve: – Detecção de colisão – Cálculo de forças – Comunicação com o(s) dispositivo(s). Arquitetura de um sistema de Geometria RV háptico -scanners imagens -Elementos Finitos -Massa-mola -LEM 30Hz Método de Simulação Sólido Embasamento físico forças 1KHz Display gráfico Display háptico Simulação em tempo real Sólido embasamento computacional -ultrasom -Visual Man Física -elasticidade -dureza -densidade -deformações Modelo (orgãos) Sólido Embasamento médico Modelos de interação • As interfaces hápticas comerciais no seu estágio atual permitem o contato pontual com os objetos virtuais. • É como tocar a cena virtual segurando uma caneta. • Funciona como um mouse 3D. Modelos de interação • O modelo mais usado para simulação do contato háptico é o proxy. • O proxy é baseado num método chamado “penalty-based”, ou baseado em penalidade. • A idéia básica é penalizar uma penetração com uma força de reação do objeto sobre o usuário de forma a “expulsar” o usuário de dentro do objeto. Modelos de interação • Nos modelos de penalidade a força é proporcional à penetração e sua direção é definida pela normal do contato. Posição do dispositivo Força de reação Força de reação Modelos de interação • Entretanto o método de penalidade não funciona bem em algumas situações particulares, como em objetos finos e nos cantos onde a penetração não é bem definida. Posição em t0 Posição em t1 ? Modelos de interação • Para resolver esses problemas foi proposto uma adaptação do método de penalidade chamado proxy. • O proxy indica uma posição de referência na superfície do objeto tocado pelo dispositivo háptico (chamado de probe). • O proxy depende da trajetória de entrada do probe no objeto e da forma do objeto. Proxy • a posição do proxy é calculada por um algoritmo de minimização que procura a posição mais próxima ao probe na superfície do objeto • o vetor formado pela diferença entre as posições do probe e do proxy, multiplicado por um fator correspondente à dureza do objeto tocado define a força a ser enviada ao dispositivo háptico. Haptics no Chai • O Chai foi concebido com foco nas interfaces hápticas. • É a primeira biblioteca 3D totalmente preparada para interagir com diversos dispositivos hápticos reais e ainda dispõe de uma dispositivo háptico virtual. • Para exemplo abra o projeto “aula7.bpr” e veja em main.cpp as rotinas: – void __fastcall TForm1::ToggleHapticsButtonClick(TObject *Sender) – void HapticLoop() Adicionando uma interface háptica à simulação tool = new cMeta3dofPointer(world, 0); camera->addChild(tool); tool->setPos(-2.0, 0.0, 0.0); tool->setWorkspace(2.0,2.0,2.0); // set up the device tool->initialize(); // open communication to the device tool->start(); // update initial orientation and position of device tool->updatePose(); // tell the tool to show his coordinate frame so you can see tool rotation tool->visualizeFrames(true); // I need to call this so the tool can update its internal // transformations before performing collision detection, etc. tool->computeGlobalPositions(); tool->setForcesON(); // Enable the "dynamic proxy", which will handle moving objects cProxyPointForceAlgo* proxy = tool->getProxy(); proxy->enableDynamicProxy(true); multi-threads • O objeto cMeta3dofPointer quando criado tenta se conectar através de memória compartilhada a outro processo rodando como servidor de um dispositivo háptico. • O Chai prevê a comunicação com dois tipos de dispositivos hápticos: o Phantom e o Delta. • Se nenhum servidor estiver ativo o objeto cMeta3dofPointer lança o executável dhdvirtual.exe, que é um simulador de dispositivo háptico. multi-threads • Dentro da aplicação Chai é preciso lançar uma thread que vai ficar se comunicando com o servidor háptico, lendo a posição do dispositivo e informando as forças calculadas: DWORD thread_id; ::CreateThread(0, 0, (LPTHREAD_START_ROUTINE)(HapticLoop), this, 0, &thread_id); // Boost thread and process priority ::SetThreadPriority(&thread_id, THREAD_PRIORITY_ABOVE_NORMAL); multi-threads • Essa thread ao ser lançada chama uma rotina chamada HapticLoop, que fará a comunicação com o servidor através de um loop. • Note que a aplicação poderia usar um timer, mas como a comunicação precisa ser muito rápida (em torno de 1KHz ou 1000 vezes por segundo), uma thread é mais eficiente pois pode ser configurada com alta prioridade para ter sua velocidade garantida. Haptic loop • O loop háptico roda enquanto a simulação estiver ativa e consiste de 3 passos principais: // read position from haptic device Form1->tool->updatePose(); // compute forces Form1->tool->computeForces(); // send forces to haptic device Form1->tool->applyForces(); Haptic loop • O método updatePose() lê e atualiza a posição do dispositivo na tela. • O método computeForces() recalcula a posição do proxy (para isso detecta antes se está havendo colisão), e recalcula as forças de interação. • O método applyForces() envia as forças calculadas para o dispositivo. Haptics no Chai • Note que a adição de haptics numa aplicação Chai consiste basicamente em adicionar os métodos ToggleHapticsButtonClick(TObjec t *Sender) e HapticLoop()ao seu main, não exigindo nenhum outro esforço de implementação.