SlideShare uma empresa Scribd logo
1
2
3
Introdução à utilização
de openFrameworks
para
o desenvolvimento de
aplicações de RVA
Claudio Kirner1 and Christopher S. Cerqueira12
1Federal University of Itajubá – Universidade Federal de Itajubá (UNIFEI)
2National Institute for Space Research – Instituto Nacional de Pesquisas Espaciais (INPE)
1ckirner@gmail.com ,2christophercerqueira@gmail.com
1http://realidadevirtual.com.br/, 2http://cscerqueira.com.br
openFrameworks
Autores:
Christopher Shneider Cerqueira – é graduado na Universidade Federal de Itajubá e
pesquisador da área de realidade virtual e aumentada desde 2009, atuando no
desenvolvimento de aplicações baseadas em ARToolKit, para o desenvolvimento de
ferramentas de autoria de realidade aumentada com cross-reality. É um dos
desenvolvedores da ferramenta de autoria comportamental basAR. Atualmente é aluno
de pós-graduação do INPE desenvolvendo um sistema de simulação de satélites
distribuídos com visualização em realidade virtual.
Claudio Kirner – é graduado em Engenharia Elétrica pela Universidade de São Paulo
(1973), mestre em Engenharia Eletrônica pelo Instituto Tecnológico de Aeronáutica (1978),
doutor em Engenharia de Sistemas e Computação pela Universidade Federal do Rio de
Janeiro (1986) e Pós-doutor pela University of Colorado at Colorado Springs – UCCS (1993-
1995). Atualmente é Professor Adjunto na Universidade Federal de Itajubá (UNIFEI). Tem
experiência em Realidade Virtual e Realidade Aumentada, Interação Humano-Computador,
Ambientes Colaborativos e educação à Distância. Coordenou o I Workshop de Realidade
Virtual, em 1997, e o I Workshop de Realidade Aumentada, em 2004, e outros
subsequentes. Orientou 30 alunos de mestrado e 8 de doutorado; coordenou Projetos
CNPq, FAPESP, RHAE e FAPEMIG; publicou cerca de 270 artigos científicos e 40 livros e
capítulos.
Dúvidas: christophercerqueira@gmail.com 4
http://imasters.com.br/artigo/9817/software/analise-do-teste-de-software-parte-02/
5
6
http://lang-index.sourceforge.net/
7
8
Overview
• Atividades de 4h
• Você vai aprender
– Conceitos básicos de design.
– openFrameworks básico.
• Estrutura de arquivos.
• Compilar exemplos.
• Como criar um projeto básico e modificá-lo.
• Utilizar complemento de biblioteca de modelos.
• Utilizar complemento de biblioteca de RA.
9
INTRODUÇÃO
Experiência, interação, desenvolvimento criativo
10
“The product is no longer the
basis of value. The experience
is.”
Venkat Ramaswamy
The Future of Competition
11
Valor de uma boa experiência
12
IHC – Interação Homem-Computador
• Estudo da interação entre pessoas e computadores.
• Onde são formadas as experiências.
13
Mas quem desenvolve experiência?
• UX Developer – User Experience
– A pessoa que caminha entra o design e a
tecnologia.
http://blog.alexandremagno.net/2013/02/o-que-seria-um-ux-developer/
14
Interação
15
Texto, som,
cores, visual,
mecânico ou
fisico.
Interface
Mensagens
Usuário Sistema
Exemplo:
• Usabilidade:
1. Facilidade de
aprendizado
2. Eficiência
3. Facilidade de
memorização
4. Erros
5. Satisfação subjetiva
16
Meta-
Mensagens
Usuário Sistema
3 níveis
Lógico: Resolvem, solucionam,
facilitam.
Emocional: Satisfazem
necessidades e desejos
afetivos.
Visceral: resolvem questões
fundamentais, sem
consciência.
Impulso.
17
Espera.... Visceral?
18
19
Processing
Adobe Flash
Unity
Cinder
openFrameworks
20
OPENFRAMEWOKS
O que é. Requisitos. Onde encontrar. Expansões. Exemplos.
21
openframeworks.cc
22
oF
• Criado para artistas e designers
• Desenvolvido por: Zach Liberman, Theo
Watson, Artuno Castro e Chris O’Shea
• Proposta: Arrumar a falta de comunicação
entre diversas bibliotecas em C++, e permitir
portabilidade.
• Escrita em C++
• Licença: MIT (educacional e venda)
23
utilizar oF quando:
• O projeto renderiza muitos gráficos 3D, e/ou;
• Utilizar muita visão computacional, e/ou;
• Controlar equipamentos, como, por exemplo,
o ARDUINO.
24
Libs no pacote padrão
• OpenGL, GLEW, GLUT, libtess2 e cairo para
gráficos.
• rtAudio, PortAudio ou FMOD e Kiss FFT para
entrada, saída e análise de áudio.
• FreeType para fontes.
• FreeImage para salvar e carregar imagens.
• Quicktime e videoInput para playback e aquisição
de vídeo.
• Poco, que contém uma variedade de utilidades.
25
C++ Portável!!!!
26
Página Principal – openframeworks.cc
27
Requisitos (deste tutorial)
VC2010E
oF
ofxARToolKitplus
28
Visual Studio C++ 2010 Express
29
1
2
30
Procedimento de teste
1. Descompacte a pasta do oF
2. Entre na pasta exemplos
3. Escolha algum (dos 100)
4. Entre na solução (.sln)  Abrir no VC2010E
5. Escolha Release e depois Build
31
• Descompactar
• Entrar na Solução
32
• Release e compilar
12
33
• Resultado de compilação esperado
34
• Funcionamento do exemplo pointPicker
35
Componentes da Comunidade
• http://ofxaddons.com/
36
Expansões
• Animation: animação de elementos simples.
• Bridges: bridges são formas de adicionar elementos de outros frameworks,
adaptando a interface de dados para o oF.
• Computer Vision: rotinas de rastreio, usando openCV e Kinect.
• Graphics: rotinas para renderizar elementos na tela.
• GUI: componentes para criar interfaces com usuário.
• Hardware Interface: rotinas de acesso a vários hardwares.
• iOS: rotinas específicas para desenvolvimento e utilização dos recursos do iOS.
• Machine Learning: rotinas de inteligência artificial.
• Physics: rotinas de processamento de física, colisão, etc.
• Sound: rotinas e wrappers de bibliotecas para tratamento e execução de áudio.
• Typography: rotinas para manipulação de texto.
• Utilities: rotinas diversas para manipulação com o computador, sistema
operacional e outros recursos.
• Video/Camera: rotinas e wrappers de bibliotecas para tratamento e execução de
vídeo e dados de câmera (incluindo Kinect e openNI).
• Web/Networking: rotinas para interconexão de sistemas, HTTP, FTP, JSON, SSL, etc. 37
ofxARToolKitPlus
• fishkingsin
38
CASO 1: O EXEMPLO VAZIO!
o exemplo vazio para explorar a estrutura de arquivos do oF, a utilização
do gerador automático e a organização do código.
39
Estrutura de Arquivos
40
Level Easy: Gerador Automático
41
Escolhendo expansões
42
Estrutura lógica do projeto no
VC2010E
43
main.cpp ... Onde tudo começa
#include "ofMain.h"
#include "testApp.h"
#include "ofAppGlutWindow.h"
//========================================================================
int main( ){
ofAppGlutWindow window;
ofSetupOpenGL(&window, 1024,768, OF_WINDOW);// <--- setup the GL context
// this kicks off the running of my app
// can be OF_WINDOW or OF_FULLSCREEN
// pass in width and height too:
ofRunApp( new testApp());
}
44
testApp.h ... OO classe principal
#pragma once
#include "ofMain.h"
class testApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
void keyPressed (int key);
void keyReleased(int key);
void mouseMoved(int x, int y );
void mouseDragged(int x, int y, int button);
void mousePressed(int x, int y, int button);
void mouseReleased(int x, int y, int button);
void windowResized(int w, int h);
void dragEvent(ofDragInfo dragInfo);
void gotMessage(ofMessage msg);
};
45
testApp.cpp ... Métodos.
#include "testApp.h"
void testApp::setup(){ }
void testApp::update(){ }
void testApp::draw(){ }
void testApp::keyPressed(int key){ }
void testApp::keyReleased(int key){ }
void testApp::mouseMoved(int x, int y ){ }
void testApp::mouseDragged(int x, int y, int button){ }
void testApp::mousePressed(int x, int y, int button){ }
void testApp::mouseReleased(int x, int y, int button){ }
void testApp::windowResized(int w, int h){ }
void testApp::gotMessage(ofMessage msg){ }
void testApp::dragEvent(ofDragInfo dragInfo){ }
46
Compilando
47
Modificando o básico
// testApp.cpp
void testApp::setup(){
mensagem = "Hello SVR2013!!!";
raio = 0;
}
void testApp::draw(){
ofSetColor(ofColor::blue);
ofCircle(x_i,y_i,raio);
ofSetColor(ofColor::red);
ofDrawBitmapString(mensagem,mouseX,mouseY);
}
// testApp.cpp
void testApp::mouseDragged(int x, int y, int
button){
raio = ofDist(x_i,y_i,x,y);
}
void testApp::mousePressed(int x, int y, int
button){
x_i = x;
y_i = y;
}
void testApp::mouseReleased(int x, int y, int
button){
raio = ofDist(x_i,y_i,x,y);
}
// testApp.h
...
string mensagem;
int x_i,y_i;
float raio;
...
48
CASO 2: MODELOS, CÂMERA E
AÇÃO!
exemplo com modelos 3D para explorar a utilização de bibliotecas de
modelos 3D e de controle de câmera.
49
• Gerar o projeto no Gerador Automático,
colocando o add-on ofxAssimp.
– Inserindo modelos
– Manipulação de câmera
50
Inserindo Modelos
• biblioteca Assimp
• Open Asset Import Library
– C++, sob licença BSD (C# e Python)
– Carrega vários formatos: Collada, Blender, 3DS
Max, AutoCad, Ogre, Quakes, Valve, Unreal e
DirectX X
– No site do Assimp, tem um viewer que facilita
descobrir se vai funcionar o modelo na biblioteca:
AssimpViewer
51
AssimpViewer
52
Lets code ... No testApp.h
// testApp.h
#pragma once
#include "ofxAssimpModelLoader.h"
#include "ofMain.h"
class testApp : public ofBaseApp{
// Não apagar o que já tinha
ofxAssimpModelLoader model;
};
// testApp.cpp
void testApp::setup(){
ofBackground(50, 0);
if( !model.loadModel("astroBoy_walk.dae", false) )
ofSystemAlertDialog("Erro no arquivo");
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
}
void testApp::draw(){
ofSetColor(255);
ofPushMatrix();
ofTranslate(ofGetWidth()/2,
ofGetHeight()/2+100,0);
model.drawFaces();
ofPopMatrix();
}
53
Copiar o modelo
• Copiar o modelo:
– astroBoy_walk.dae
– boy_10.tga (textura)
• do exemplo
<of>examplesaddonsassimpExamplebindata
54
Resultado
55
Manipulando o modelo - ofEasyCam
• Componente de manipulação de câmera.
56
Lets code...
// testApp.h
#pragma once
#include "ofxAssimpModelLoader.h"
#include "ofMain.h"
class testApp : public ofBaseApp{
...
ofxAssimpModelLoader model;
ofEasyCam cam;
}; // testApp.cpp
void testApp::draw(){
ofSetColor(255);
cam.begin();
model.drawFaces();
cam.end();}
57
CASO 3: AUMENTANDO A
REALIDADE!
exemplo com RA para explorar a utilização de add-ons adicionais.
58
Realidade Aumentada
59
60
Definição atual
Uma definição mais atualizada é: realidade
aumentada é uma interfacebaseada na
sobreposição de informações virtuais geradas por
computador (envolvendo imagens estáticas e
dinâmicas, sons espaciais e sensações hápticas)
com o ambiente físico do usuário, percebida
através de dispositivos tecnológicos e usando as
interações naturais do usuário, no mundo físico.
(KIRNER 2011)
61
Informação virtual
Interação Natural
dispositivos tecnológicos
62
63
Frameworks
Marcador
• ARToolKit (C) – 90´s
• NYARToolKit (Java, C#, C++,
Android)
• AndAR (Android)
• FLARToolKit (AS3)
Sem marcador
• OpenCV - Multiplataforma
• PTAMM (C++)
64
Ferramentas de Autoria
basAR FLARAS
65
Marcadores
ARToolKit
• HITLab
• Compara templates.
• Template marker detection
• Mais lento
• Inviável em SW embarcado.
ARToolKitPlus
• Graz University of
Technology
• Compara códigos
• ID-Encoded marker
detection
• Mais rápido
• Bom para SW embarcado.
66
ARToolKit
67
ARToolKitPlus
68
69
70
Voltando ao mundo real
• openFrameworks + ARToolKitPlus.
• Add-on ofxARToolKitPlus.
• Descompactá-lo e salvar dentro de
<of>/addons
• Renomear, retirando o sufixo -master
71
• Utilizar o gerador automático e gerar com os
seguintes add-nos:
• ofxARToolKitPlus
• ofxOpenCv (necessário para o
ofxARToolKitPlus)
• ofxAssimpModelLoader
72
Ajustando o projeto - caminhos
1. Configuration Properties  Linker
GeneralAdditional Library Directories e
inclua o caminho para a biblioteca, no caso:
......addonsofxARtoolkitPluslibsARToolKit
Pluslibwin32
73
Ajustando o projeto - lib
1. Configuration Properties  Linker Input 
Additional Dependencies incluir a lib:
ARToolKitPlus.lib
74
Lets code...
// testApp.cpp
#pragma once
#include "ofMain.h"
#include "ofxOpenCv.h" //Cabeçalho do OpenCV
#include "ofxARToolkitPlus.h" //Cabeçalho do ARToolKitPlus
class testApp : public ofBaseApp{
...
int width, height; // Tamanho da janela da câmera
ofVideoGrabber vidGrabber; // Componente do oF que pega a câmera.
ofxARToolkitPlus artk; // Instância do ARToolKitPlus
int threshold; // Threshold da relação preto/branco
ofxCvColorImage colorImage; //imagem capturada pela câmera
ofxCvGrayscaleImage grayImage; //imagem em tons de cinza (mais rápida)
ofxCvGrayscaleImage grayThres;//imagem com threshold antes de ir pro artk
};
75
Configurando – testApp::setup()
//--------------------------------------------------------------
void testApp::setup(){
ofSetWindowShape(1280,480); // Ajusta o tamanho da aplicação
width = 640; height = 480; // largura e altura da imagem da câmera
vidGrabber.initGrabber(width, height); // reserva buffer da câmera
colorImage.allocate(width, height); // reserva imagem colorida
grayImage.allocate(width, height); // reserva imagem mono
grayThres.allocate(width, height); // reserva imagem ajustada
artk.setup(width, height); // inicia o ARToolKitPlus
threshold = 85; // threshold para a imagem ajustada
artk.setThreshold(threshold); // informa ao ARToolKitPlus que o ajuste
é externo
}
76
Rastreio - testApp::update()
//--------------------------------------------------------------
void testApp::update(){
vidGrabber.grabFrame();
// Pega frame da câmera
bool bNewFrame = vidGrabber.isFrameNew();// é um frame novo
if(bNewFrame) { // se um frame novo
/pega os pixels do buffer da câmera e armazena
colorImage.setFromPixels(vidGrabber.getPixels(), width, height);
grayImage = colorImage; //converte a imagem para mono
//Como queremos testar o threshold temos que gerar essa imagem
grayThres = grayImage;
grayThres.threshold(threshold);
//Passa para o ARToolKitPlus a imagem monocromática
artk.update(grayImage.getPixels());
}
} 77
Exibindo - testApp::draw() – p1
//--------------------------------------------------------------
void testApp::draw(){
ofSetColor(ofColor::white); // inicia a cor dos objetos como branca
colorImage.draw(0, 0); // exibe a imagem capturada colorida
grayThres.draw(640, 0); // exibe a imagem adaptada
artk.draw(640, 0); // Esta função exibe a posição e etiqueta o
marcador
// ARTK 3D
artk.applyProjectionMatrix(); // primeiro passo é aplicar a matriz de
projeção da camera
int numDetected = artk.getNumDetectedMarkers(); //detectar os marcadores
ofEnableAlphaBlending();
//habilitar a transparência
78
Exibindo - testApp::draw() – p2
for(int i=0; i<numDetected; i++) { // marcadores encontrados
artk.applyModelMatrix(i); //matriz de perspectiva do marcador
//Local onde colocar o conteúdo 3D do marcador
// neste exemplo é uma pilha de retângulos.
ofNoFill();
ofEnableSmoothing();
ofSetColor(255, 255, 0, 50);
for(int i=0; i<10; i++) {
ofRect(-25, -25, 50, 50);
ofTranslate(0, 0, i*1);
}
}
}
79
Alterando o threshold -
testApp::keyPressed(int key)
//--------------------------------------------------------------
void testApp::keyPressed(int key){
if(key == OF_KEY_UP) {
artk.setThreshold(++threshold); // aumenta o valor do threshold
} else if(key == OF_KEY_DOWN) {
artk.setThreshold(--threshold); // diminui o valor do threshold
} else if(key == 's') {
vidGrabber.videoSettings(); // chama a configuração da câmera
}
}
80
Resultado esperado
81
Adicionando conteúdo
• Adicionar o modelo via
ofxAssimpModelLoader
• Reutilizar o modelo do exemplo anterior.
82
Só adicionar o Assimp
#pragma once
#include "ofMain.h"
#include "ofxOpenCv.h"
#include "ofxARToolkitPlus.h"
#include "ofxAssimpModelLoader.h"
class testApp : public ofBaseApp{
...
ofxCvGrayscaleImage grayThres;
ofxAssimpModelLoader model;
};
83
Setup e Draw...
• //--------------------------------------------------------------
• void testApp::setup(){
• ...
• if( !model.loadModel("astroBoy_walk.dae", false) ) // Abre o arquivo
• ofSystemAlertDialog("Erro em carregar arquivo");
• }
84
//--------------------------------------------------------------
void testApp::draw(){
// ARTK 3D
...
for(int i=0; i<numDetected; i++) { // marcadores encontrados
...
//Local onde colocar o conteúdo 3D do marcador
//pilha de retângulos.
// Modelo 3D
ofSetColor(255); // Configura a cor do objeto
ofPushMatrix(); // Abre o contexto
glEnable(GL_DEPTH_TEST); // habilita profundidade
ofScale(0.1,0.1,0.1); // ajusta escala
ofRotateX(-90); // rotaciona 90 graus
model.drawFaces(); / desenha as faces
glDisable(GL_DEPTH_TEST); // desabilita profundidade
ofPopMatrix(); // fecha o contexto
}
}
85
86
FINALIZANDO
87
• Apresentar um ferramental, de desenvolvimento
multi-plataforma baseado em C++, chamado
openFrameworks.
• Apresentou-se dois casos introdutórios, para
explicar o framework e sua estrutura e o uso de
elementos adicionais, no caso o uso da biblioteca
Assimp, chamados add-on, finalizando com um
exemplo de construção de ambientes de
realidade aumentada utilizando uma biblioteca
similar ao ARToolKitPlus.
88
• Como contribuição, esperamos que este
ferramental auxilie no desenvolvimento de
aplicações mais criativas e de desenvolvimento
veloz, com:
– Codificação C++ portável
– Facilidade de acesso a hardware
– Múltiplos componentes prontos disponíveis pela
comunidade
– Facilidade de acesso ao disco
– Facilidade de comunicação
– Facilidade de uso de áudio e vídeo.
89
• Como sugestão de livro e aprofundamento,
aconselhamos o livro Programming
Interactivity da O´Reilly e os tutoriais do site
do openFrameworks.
90
91
Introdução à utilização de
openFrameworks para
o desenvolvimento de aplicações
de RVA
Claudio Kirner1 and Christopher S. Cerqueira12
1Federal University of Itajubá – Universidade Federal de Itajubá (UNIFEI)
2National Institute for Space Research – Instituto Nacional de Pesquisas Espaciais (INPE)
1ckirner@gmail.com ,2christophercerqueira@gmail.com
1http://realidadevirtual.com.br/, 2http://cscerqueira.com.br
Dúvidas: christophercerqueira@gmail.com
92

Mais conteúdo relacionado

ODP
Kyrios: Infra-estrutura livre para desenvolvimento de software
PDF
Marcadore ar toolkit
PDF
Ar tool kit-cap6-2004
PPT
Artoolkit
PDF
Demonstrador Virtual Web com Recursos de Realidade Aumentada
PDF
Blender tcc
PPTX
Realidade aumentada no ensino da história
PDF
Monografia - Representação de Ambientes com recursos de Realidade Aumentada
Kyrios: Infra-estrutura livre para desenvolvimento de software
Marcadore ar toolkit
Ar tool kit-cap6-2004
Artoolkit
Demonstrador Virtual Web com Recursos de Realidade Aumentada
Blender tcc
Realidade aumentada no ensino da história
Monografia - Representação de Ambientes com recursos de Realidade Aumentada

Semelhante a Introdução à utilização de openFrameworks para o desenvolvimento de aplicações de RVA (20)

PDF
Construção de aplicações de Realidade Cruzada Projetiva utilizando openFramew...
PDF
[WRVA2014] Utilização de Realidade Aumentada, com marcadores(ARToolKitPlus) e...
PDF
Construção de interfaces on-demand baseadas em Realidade Aumentada Projetiva ...
PDF
PDF
Rich Internet Applications com clientes offline utilizando Gears
PDF
Otimizações em Sistemas de Armazenamento mediadas por anotações em Metadados
PDF
Monografia eng soft1_halan
PDF
SINFO Geração ALPHA
PDF
Apostila de poo em c++
PDF
Apostila de poo em c++
PPTX
Apps tecnologias e usos
PDF
Percepções de uma viagem em dois mundos: Java e Python
PDF
Qualificação MACC- Entities
PDF
TDC2016SP - Revitalizando aplicações desktop usando CefGlue, MessageBus e Rea...
PPT
PPT
Padrões de Projeto de Software Orientado a Objetos
PPT
SimulaRSO - Simulador de Recursos de Sistemas Operacionais
PDF
TDC2016POA | Trilha Arquetetura - Revitalizando aplicações desktop usando Ce...
PDF
TDC2016SP Trilha Arquitetura.NET - Revitalizando aplicações desktop usando C...
PPTX
Arquitetura de Software e o DNAD2013
Construção de aplicações de Realidade Cruzada Projetiva utilizando openFramew...
[WRVA2014] Utilização de Realidade Aumentada, com marcadores(ARToolKitPlus) e...
Construção de interfaces on-demand baseadas em Realidade Aumentada Projetiva ...
Rich Internet Applications com clientes offline utilizando Gears
Otimizações em Sistemas de Armazenamento mediadas por anotações em Metadados
Monografia eng soft1_halan
SINFO Geração ALPHA
Apostila de poo em c++
Apostila de poo em c++
Apps tecnologias e usos
Percepções de uma viagem em dois mundos: Java e Python
Qualificação MACC- Entities
TDC2016SP - Revitalizando aplicações desktop usando CefGlue, MessageBus e Rea...
Padrões de Projeto de Software Orientado a Objetos
SimulaRSO - Simulador de Recursos de Sistemas Operacionais
TDC2016POA | Trilha Arquetetura - Revitalizando aplicações desktop usando Ce...
TDC2016SP Trilha Arquitetura.NET - Revitalizando aplicações desktop usando C...
Arquitetura de Software e o DNAD2013
Anúncio

Mais de Christopher Cerqueira (20)

PDF
MICRO SATÉLITES BRASILEIROS, ELES EXISTEM?
PDF
Jornada Espacial 2018 - Cubesats: o que são e pra que servem
PDF
CI2018_Simuladores
PDF
CI2018_MBSE4.0
PDF
[Thesis] Tangible Collaboration applied in Space Systems Concurrent Engineeri...
PDF
XV Jornada do Espaço
PDF
Using Finite State Machines From Concept to Realization
PDF
So 01 - processos
PDF
Redes 05 - aplicação
PDF
Redes 04 - transporte
PDF
Redes 03 - rede
PDF
Redes 02 - enlace
PDF
Redes 01 - topologia
PDF
Intro heuristica
PDF
[Ci2017] Simuladores de Satélites
PDF
MBSE e Espaço 4.0
PDF
A Model Based Concurrent Engineering Framework using ISO-19450 Standard
PDF
Introdução à Engenharia Espacial
PDF
CubeSats e Software Embarcado
PDF
Modelos e metodologias de projeto de sistemas
MICRO SATÉLITES BRASILEIROS, ELES EXISTEM?
Jornada Espacial 2018 - Cubesats: o que são e pra que servem
CI2018_Simuladores
CI2018_MBSE4.0
[Thesis] Tangible Collaboration applied in Space Systems Concurrent Engineeri...
XV Jornada do Espaço
Using Finite State Machines From Concept to Realization
So 01 - processos
Redes 05 - aplicação
Redes 04 - transporte
Redes 03 - rede
Redes 02 - enlace
Redes 01 - topologia
Intro heuristica
[Ci2017] Simuladores de Satélites
MBSE e Espaço 4.0
A Model Based Concurrent Engineering Framework using ISO-19450 Standard
Introdução à Engenharia Espacial
CubeSats e Software Embarcado
Modelos e metodologias de projeto de sistemas
Anúncio

Introdução à utilização de openFrameworks para o desenvolvimento de aplicações de RVA

  • 1. 1
  • 2. 2
  • 3. 3 Introdução à utilização de openFrameworks para o desenvolvimento de aplicações de RVA Claudio Kirner1 and Christopher S. Cerqueira12 1Federal University of Itajubá – Universidade Federal de Itajubá (UNIFEI) 2National Institute for Space Research – Instituto Nacional de Pesquisas Espaciais (INPE) 1ckirner@gmail.com ,2christophercerqueira@gmail.com 1http://realidadevirtual.com.br/, 2http://cscerqueira.com.br openFrameworks
  • 4. Autores: Christopher Shneider Cerqueira – é graduado na Universidade Federal de Itajubá e pesquisador da área de realidade virtual e aumentada desde 2009, atuando no desenvolvimento de aplicações baseadas em ARToolKit, para o desenvolvimento de ferramentas de autoria de realidade aumentada com cross-reality. É um dos desenvolvedores da ferramenta de autoria comportamental basAR. Atualmente é aluno de pós-graduação do INPE desenvolvendo um sistema de simulação de satélites distribuídos com visualização em realidade virtual. Claudio Kirner – é graduado em Engenharia Elétrica pela Universidade de São Paulo (1973), mestre em Engenharia Eletrônica pelo Instituto Tecnológico de Aeronáutica (1978), doutor em Engenharia de Sistemas e Computação pela Universidade Federal do Rio de Janeiro (1986) e Pós-doutor pela University of Colorado at Colorado Springs – UCCS (1993- 1995). Atualmente é Professor Adjunto na Universidade Federal de Itajubá (UNIFEI). Tem experiência em Realidade Virtual e Realidade Aumentada, Interação Humano-Computador, Ambientes Colaborativos e educação à Distância. Coordenou o I Workshop de Realidade Virtual, em 1997, e o I Workshop de Realidade Aumentada, em 2004, e outros subsequentes. Orientou 30 alunos de mestrado e 8 de doutorado; coordenou Projetos CNPq, FAPESP, RHAE e FAPEMIG; publicou cerca de 270 artigos científicos e 40 livros e capítulos. Dúvidas: christophercerqueira@gmail.com 4
  • 6. 6
  • 8. 8
  • 9. Overview • Atividades de 4h • Você vai aprender – Conceitos básicos de design. – openFrameworks básico. • Estrutura de arquivos. • Compilar exemplos. • Como criar um projeto básico e modificá-lo. • Utilizar complemento de biblioteca de modelos. • Utilizar complemento de biblioteca de RA. 9
  • 11. “The product is no longer the basis of value. The experience is.” Venkat Ramaswamy The Future of Competition 11
  • 12. Valor de uma boa experiência 12
  • 13. IHC – Interação Homem-Computador • Estudo da interação entre pessoas e computadores. • Onde são formadas as experiências. 13
  • 14. Mas quem desenvolve experiência? • UX Developer – User Experience – A pessoa que caminha entra o design e a tecnologia. http://blog.alexandremagno.net/2013/02/o-que-seria-um-ux-developer/ 14
  • 15. Interação 15 Texto, som, cores, visual, mecânico ou fisico. Interface Mensagens Usuário Sistema
  • 16. Exemplo: • Usabilidade: 1. Facilidade de aprendizado 2. Eficiência 3. Facilidade de memorização 4. Erros 5. Satisfação subjetiva 16 Meta- Mensagens Usuário Sistema
  • 17. 3 níveis Lógico: Resolvem, solucionam, facilitam. Emocional: Satisfazem necessidades e desejos afetivos. Visceral: resolvem questões fundamentais, sem consciência. Impulso. 17
  • 19. 19
  • 21. OPENFRAMEWOKS O que é. Requisitos. Onde encontrar. Expansões. Exemplos. 21
  • 23. oF • Criado para artistas e designers • Desenvolvido por: Zach Liberman, Theo Watson, Artuno Castro e Chris O’Shea • Proposta: Arrumar a falta de comunicação entre diversas bibliotecas em C++, e permitir portabilidade. • Escrita em C++ • Licença: MIT (educacional e venda) 23
  • 24. utilizar oF quando: • O projeto renderiza muitos gráficos 3D, e/ou; • Utilizar muita visão computacional, e/ou; • Controlar equipamentos, como, por exemplo, o ARDUINO. 24
  • 25. Libs no pacote padrão • OpenGL, GLEW, GLUT, libtess2 e cairo para gráficos. • rtAudio, PortAudio ou FMOD e Kiss FFT para entrada, saída e análise de áudio. • FreeType para fontes. • FreeImage para salvar e carregar imagens. • Quicktime e videoInput para playback e aquisição de vídeo. • Poco, que contém uma variedade de utilidades. 25
  • 27. Página Principal – openframeworks.cc 27
  • 29. Visual Studio C++ 2010 Express 29
  • 31. Procedimento de teste 1. Descompacte a pasta do oF 2. Entre na pasta exemplos 3. Escolha algum (dos 100) 4. Entre na solução (.sln)  Abrir no VC2010E 5. Escolha Release e depois Build 31
  • 32. • Descompactar • Entrar na Solução 32
  • 33. • Release e compilar 12 33
  • 34. • Resultado de compilação esperado 34
  • 35. • Funcionamento do exemplo pointPicker 35
  • 36. Componentes da Comunidade • http://ofxaddons.com/ 36
  • 37. Expansões • Animation: animação de elementos simples. • Bridges: bridges são formas de adicionar elementos de outros frameworks, adaptando a interface de dados para o oF. • Computer Vision: rotinas de rastreio, usando openCV e Kinect. • Graphics: rotinas para renderizar elementos na tela. • GUI: componentes para criar interfaces com usuário. • Hardware Interface: rotinas de acesso a vários hardwares. • iOS: rotinas específicas para desenvolvimento e utilização dos recursos do iOS. • Machine Learning: rotinas de inteligência artificial. • Physics: rotinas de processamento de física, colisão, etc. • Sound: rotinas e wrappers de bibliotecas para tratamento e execução de áudio. • Typography: rotinas para manipulação de texto. • Utilities: rotinas diversas para manipulação com o computador, sistema operacional e outros recursos. • Video/Camera: rotinas e wrappers de bibliotecas para tratamento e execução de vídeo e dados de câmera (incluindo Kinect e openNI). • Web/Networking: rotinas para interconexão de sistemas, HTTP, FTP, JSON, SSL, etc. 37
  • 39. CASO 1: O EXEMPLO VAZIO! o exemplo vazio para explorar a estrutura de arquivos do oF, a utilização do gerador automático e a organização do código. 39
  • 41. Level Easy: Gerador Automático 41
  • 43. Estrutura lógica do projeto no VC2010E 43
  • 44. main.cpp ... Onde tudo começa #include "ofMain.h" #include "testApp.h" #include "ofAppGlutWindow.h" //======================================================================== int main( ){ ofAppGlutWindow window; ofSetupOpenGL(&window, 1024,768, OF_WINDOW);// <--- setup the GL context // this kicks off the running of my app // can be OF_WINDOW or OF_FULLSCREEN // pass in width and height too: ofRunApp( new testApp()); } 44
  • 45. testApp.h ... OO classe principal #pragma once #include "ofMain.h" class testApp : public ofBaseApp{ public: void setup(); void update(); void draw(); void keyPressed (int key); void keyReleased(int key); void mouseMoved(int x, int y ); void mouseDragged(int x, int y, int button); void mousePressed(int x, int y, int button); void mouseReleased(int x, int y, int button); void windowResized(int w, int h); void dragEvent(ofDragInfo dragInfo); void gotMessage(ofMessage msg); }; 45
  • 46. testApp.cpp ... Métodos. #include "testApp.h" void testApp::setup(){ } void testApp::update(){ } void testApp::draw(){ } void testApp::keyPressed(int key){ } void testApp::keyReleased(int key){ } void testApp::mouseMoved(int x, int y ){ } void testApp::mouseDragged(int x, int y, int button){ } void testApp::mousePressed(int x, int y, int button){ } void testApp::mouseReleased(int x, int y, int button){ } void testApp::windowResized(int w, int h){ } void testApp::gotMessage(ofMessage msg){ } void testApp::dragEvent(ofDragInfo dragInfo){ } 46
  • 48. Modificando o básico // testApp.cpp void testApp::setup(){ mensagem = "Hello SVR2013!!!"; raio = 0; } void testApp::draw(){ ofSetColor(ofColor::blue); ofCircle(x_i,y_i,raio); ofSetColor(ofColor::red); ofDrawBitmapString(mensagem,mouseX,mouseY); } // testApp.cpp void testApp::mouseDragged(int x, int y, int button){ raio = ofDist(x_i,y_i,x,y); } void testApp::mousePressed(int x, int y, int button){ x_i = x; y_i = y; } void testApp::mouseReleased(int x, int y, int button){ raio = ofDist(x_i,y_i,x,y); } // testApp.h ... string mensagem; int x_i,y_i; float raio; ... 48
  • 49. CASO 2: MODELOS, CÂMERA E AÇÃO! exemplo com modelos 3D para explorar a utilização de bibliotecas de modelos 3D e de controle de câmera. 49
  • 50. • Gerar o projeto no Gerador Automático, colocando o add-on ofxAssimp. – Inserindo modelos – Manipulação de câmera 50
  • 51. Inserindo Modelos • biblioteca Assimp • Open Asset Import Library – C++, sob licença BSD (C# e Python) – Carrega vários formatos: Collada, Blender, 3DS Max, AutoCad, Ogre, Quakes, Valve, Unreal e DirectX X – No site do Assimp, tem um viewer que facilita descobrir se vai funcionar o modelo na biblioteca: AssimpViewer 51
  • 53. Lets code ... No testApp.h // testApp.h #pragma once #include "ofxAssimpModelLoader.h" #include "ofMain.h" class testApp : public ofBaseApp{ // Não apagar o que já tinha ofxAssimpModelLoader model; }; // testApp.cpp void testApp::setup(){ ofBackground(50, 0); if( !model.loadModel("astroBoy_walk.dae", false) ) ofSystemAlertDialog("Erro no arquivo"); glEnable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH); } void testApp::draw(){ ofSetColor(255); ofPushMatrix(); ofTranslate(ofGetWidth()/2, ofGetHeight()/2+100,0); model.drawFaces(); ofPopMatrix(); } 53
  • 54. Copiar o modelo • Copiar o modelo: – astroBoy_walk.dae – boy_10.tga (textura) • do exemplo <of>examplesaddonsassimpExamplebindata 54
  • 56. Manipulando o modelo - ofEasyCam • Componente de manipulação de câmera. 56
  • 57. Lets code... // testApp.h #pragma once #include "ofxAssimpModelLoader.h" #include "ofMain.h" class testApp : public ofBaseApp{ ... ofxAssimpModelLoader model; ofEasyCam cam; }; // testApp.cpp void testApp::draw(){ ofSetColor(255); cam.begin(); model.drawFaces(); cam.end();} 57
  • 58. CASO 3: AUMENTANDO A REALIDADE! exemplo com RA para explorar a utilização de add-ons adicionais. 58
  • 60. 60
  • 61. Definição atual Uma definição mais atualizada é: realidade aumentada é uma interfacebaseada na sobreposição de informações virtuais geradas por computador (envolvendo imagens estáticas e dinâmicas, sons espaciais e sensações hápticas) com o ambiente físico do usuário, percebida através de dispositivos tecnológicos e usando as interações naturais do usuário, no mundo físico. (KIRNER 2011) 61
  • 63. 63
  • 64. Frameworks Marcador • ARToolKit (C) – 90´s • NYARToolKit (Java, C#, C++, Android) • AndAR (Android) • FLARToolKit (AS3) Sem marcador • OpenCV - Multiplataforma • PTAMM (C++) 64
  • 66. Marcadores ARToolKit • HITLab • Compara templates. • Template marker detection • Mais lento • Inviável em SW embarcado. ARToolKitPlus • Graz University of Technology • Compara códigos • ID-Encoded marker detection • Mais rápido • Bom para SW embarcado. 66
  • 69. 69
  • 70. 70
  • 71. Voltando ao mundo real • openFrameworks + ARToolKitPlus. • Add-on ofxARToolKitPlus. • Descompactá-lo e salvar dentro de <of>/addons • Renomear, retirando o sufixo -master 71
  • 72. • Utilizar o gerador automático e gerar com os seguintes add-nos: • ofxARToolKitPlus • ofxOpenCv (necessário para o ofxARToolKitPlus) • ofxAssimpModelLoader 72
  • 73. Ajustando o projeto - caminhos 1. Configuration Properties  Linker GeneralAdditional Library Directories e inclua o caminho para a biblioteca, no caso: ......addonsofxARtoolkitPluslibsARToolKit Pluslibwin32 73
  • 74. Ajustando o projeto - lib 1. Configuration Properties  Linker Input  Additional Dependencies incluir a lib: ARToolKitPlus.lib 74
  • 75. Lets code... // testApp.cpp #pragma once #include "ofMain.h" #include "ofxOpenCv.h" //Cabeçalho do OpenCV #include "ofxARToolkitPlus.h" //Cabeçalho do ARToolKitPlus class testApp : public ofBaseApp{ ... int width, height; // Tamanho da janela da câmera ofVideoGrabber vidGrabber; // Componente do oF que pega a câmera. ofxARToolkitPlus artk; // Instância do ARToolKitPlus int threshold; // Threshold da relação preto/branco ofxCvColorImage colorImage; //imagem capturada pela câmera ofxCvGrayscaleImage grayImage; //imagem em tons de cinza (mais rápida) ofxCvGrayscaleImage grayThres;//imagem com threshold antes de ir pro artk }; 75
  • 76. Configurando – testApp::setup() //-------------------------------------------------------------- void testApp::setup(){ ofSetWindowShape(1280,480); // Ajusta o tamanho da aplicação width = 640; height = 480; // largura e altura da imagem da câmera vidGrabber.initGrabber(width, height); // reserva buffer da câmera colorImage.allocate(width, height); // reserva imagem colorida grayImage.allocate(width, height); // reserva imagem mono grayThres.allocate(width, height); // reserva imagem ajustada artk.setup(width, height); // inicia o ARToolKitPlus threshold = 85; // threshold para a imagem ajustada artk.setThreshold(threshold); // informa ao ARToolKitPlus que o ajuste é externo } 76
  • 77. Rastreio - testApp::update() //-------------------------------------------------------------- void testApp::update(){ vidGrabber.grabFrame(); // Pega frame da câmera bool bNewFrame = vidGrabber.isFrameNew();// é um frame novo if(bNewFrame) { // se um frame novo /pega os pixels do buffer da câmera e armazena colorImage.setFromPixels(vidGrabber.getPixels(), width, height); grayImage = colorImage; //converte a imagem para mono //Como queremos testar o threshold temos que gerar essa imagem grayThres = grayImage; grayThres.threshold(threshold); //Passa para o ARToolKitPlus a imagem monocromática artk.update(grayImage.getPixels()); } } 77
  • 78. Exibindo - testApp::draw() – p1 //-------------------------------------------------------------- void testApp::draw(){ ofSetColor(ofColor::white); // inicia a cor dos objetos como branca colorImage.draw(0, 0); // exibe a imagem capturada colorida grayThres.draw(640, 0); // exibe a imagem adaptada artk.draw(640, 0); // Esta função exibe a posição e etiqueta o marcador // ARTK 3D artk.applyProjectionMatrix(); // primeiro passo é aplicar a matriz de projeção da camera int numDetected = artk.getNumDetectedMarkers(); //detectar os marcadores ofEnableAlphaBlending(); //habilitar a transparência 78
  • 79. Exibindo - testApp::draw() – p2 for(int i=0; i<numDetected; i++) { // marcadores encontrados artk.applyModelMatrix(i); //matriz de perspectiva do marcador //Local onde colocar o conteúdo 3D do marcador // neste exemplo é uma pilha de retângulos. ofNoFill(); ofEnableSmoothing(); ofSetColor(255, 255, 0, 50); for(int i=0; i<10; i++) { ofRect(-25, -25, 50, 50); ofTranslate(0, 0, i*1); } } } 79
  • 80. Alterando o threshold - testApp::keyPressed(int key) //-------------------------------------------------------------- void testApp::keyPressed(int key){ if(key == OF_KEY_UP) { artk.setThreshold(++threshold); // aumenta o valor do threshold } else if(key == OF_KEY_DOWN) { artk.setThreshold(--threshold); // diminui o valor do threshold } else if(key == 's') { vidGrabber.videoSettings(); // chama a configuração da câmera } } 80
  • 82. Adicionando conteúdo • Adicionar o modelo via ofxAssimpModelLoader • Reutilizar o modelo do exemplo anterior. 82
  • 83. Só adicionar o Assimp #pragma once #include "ofMain.h" #include "ofxOpenCv.h" #include "ofxARToolkitPlus.h" #include "ofxAssimpModelLoader.h" class testApp : public ofBaseApp{ ... ofxCvGrayscaleImage grayThres; ofxAssimpModelLoader model; }; 83
  • 84. Setup e Draw... • //-------------------------------------------------------------- • void testApp::setup(){ • ... • if( !model.loadModel("astroBoy_walk.dae", false) ) // Abre o arquivo • ofSystemAlertDialog("Erro em carregar arquivo"); • } 84
  • 85. //-------------------------------------------------------------- void testApp::draw(){ // ARTK 3D ... for(int i=0; i<numDetected; i++) { // marcadores encontrados ... //Local onde colocar o conteúdo 3D do marcador //pilha de retângulos. // Modelo 3D ofSetColor(255); // Configura a cor do objeto ofPushMatrix(); // Abre o contexto glEnable(GL_DEPTH_TEST); // habilita profundidade ofScale(0.1,0.1,0.1); // ajusta escala ofRotateX(-90); // rotaciona 90 graus model.drawFaces(); / desenha as faces glDisable(GL_DEPTH_TEST); // desabilita profundidade ofPopMatrix(); // fecha o contexto } } 85
  • 86. 86
  • 88. • Apresentar um ferramental, de desenvolvimento multi-plataforma baseado em C++, chamado openFrameworks. • Apresentou-se dois casos introdutórios, para explicar o framework e sua estrutura e o uso de elementos adicionais, no caso o uso da biblioteca Assimp, chamados add-on, finalizando com um exemplo de construção de ambientes de realidade aumentada utilizando uma biblioteca similar ao ARToolKitPlus. 88
  • 89. • Como contribuição, esperamos que este ferramental auxilie no desenvolvimento de aplicações mais criativas e de desenvolvimento veloz, com: – Codificação C++ portável – Facilidade de acesso a hardware – Múltiplos componentes prontos disponíveis pela comunidade – Facilidade de acesso ao disco – Facilidade de comunicação – Facilidade de uso de áudio e vídeo. 89
  • 90. • Como sugestão de livro e aprofundamento, aconselhamos o livro Programming Interactivity da O´Reilly e os tutoriais do site do openFrameworks. 90
  • 91. 91 Introdução à utilização de openFrameworks para o desenvolvimento de aplicações de RVA Claudio Kirner1 and Christopher S. Cerqueira12 1Federal University of Itajubá – Universidade Federal de Itajubá (UNIFEI) 2National Institute for Space Research – Instituto Nacional de Pesquisas Espaciais (INPE) 1ckirner@gmail.com ,2christophercerqueira@gmail.com 1http://realidadevirtual.com.br/, 2http://cscerqueira.com.br Dúvidas: christophercerqueira@gmail.com
  • 92. 92