Flex: <br />Realidade Aumentada e Arduíno<br />Como ligar a Realidade Aumentada ao código adobe Flex®<br />All sections to...
Resumo<br />Da Realidade Aumentada à Realidade<br />
Flex: Realidade Aumentada e Arduíno<br />Adobe @ theMuseum<br />
Ligação Flex ao Arduíno<br />
Downloads<br />Download Software Arduíno<br />Download AS3 Glue<br />Download Serial Proxy<br />
http://www.arduino.cc<br />http://code.google.com/p/arduino/downloads/list<br />
http://www.cote.cc/blog/serialproxy-v014-can-use-com-ports-above-9<br />
http://code.google.com/p/as3glue/downloads/list<br />
Instalação/Configuração<br />Instalação Arduino<br />Configuração SerialProxy<br />Configuração Flex<br />
Configuração SerialProxy<br />newlines_to_nils=false<br /># Comm ports used<br />comm_ports=10,2,3,4<br /># Default settin...
Copie a pasta Arduíno para o seu computador<br />Ligue o Arduíno ao seu computador<br />Windows Vista<br />Windows 7<br />
Windows 7<br />
Windows 7 (cont.)<br />
Windows 7 (cont.)<br />
Windows 7 (drivers)<br />
Flex Builder ®<br />
Flex Builder®<br />pptPlex Section Divider<br />The slides after this divider will be grouped into a section and given the...
AS3 Glue<br />
Código AS3 apoiado pela Livraria Glue<br />
Ligações do Arduíno<br />+ <br />   a<br />-   c<br />
No Flex Builder®<br />
packageexamples<br />{<br />//  importação das bibliotecas do FLARManager cujo autor é EricSocolofsky http://transmote.com...
Upcoming SlideShare
Loading in …5
×

Adobeatmuseum

978 views
897 views

Published on

Apresentação sobre como ligar a realidade aumentada a um arduido

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
978
On SlideShare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Adobeatmuseum

  1. 1. Flex: <br />Realidade Aumentada e Arduíno<br />Como ligar a Realidade Aumentada ao código adobe Flex®<br />All sections to appear here<br />
  2. 2. Resumo<br />Da Realidade Aumentada à Realidade<br />
  3. 3. Flex: Realidade Aumentada e Arduíno<br />Adobe @ theMuseum<br />
  4. 4. Ligação Flex ao Arduíno<br />
  5. 5. Downloads<br />Download Software Arduíno<br />Download AS3 Glue<br />Download Serial Proxy<br />
  6. 6. http://www.arduino.cc<br />http://code.google.com/p/arduino/downloads/list<br />
  7. 7. http://www.cote.cc/blog/serialproxy-v014-can-use-com-ports-above-9<br />
  8. 8. http://code.google.com/p/as3glue/downloads/list<br />
  9. 9. Instalação/Configuração<br />Instalação Arduino<br />Configuração SerialProxy<br />Configuração Flex<br />
  10. 10. Configuração SerialProxy<br />newlines_to_nils=false<br /># Comm ports used<br />comm_ports=10,2,3,4<br /># Default settings<br />comm_baud=57600<br />comm_databits=8<br />comm_stopbits=1<br />comm_parity=none<br /># Idle time out in seconds<br />timeout=300<br /># Port 10 settings (ttyS0)<br />net_port10=5331<br /># Port 2 settings (ttyS1)<br />net_port2=5332<br /># Port 3 settings (ttyS2)<br />net_port3=5333<br /># Port 4 settings (ttyS3)<br />net_port4=5334<br />
  11. 11. Copie a pasta Arduíno para o seu computador<br />Ligue o Arduíno ao seu computador<br />Windows Vista<br />Windows 7<br />
  12. 12. Windows 7<br />
  13. 13. Windows 7 (cont.)<br />
  14. 14. Windows 7 (cont.)<br />
  15. 15. Windows 7 (drivers)<br />
  16. 16. Flex Builder ®<br />
  17. 17. Flex Builder®<br />pptPlex Section Divider<br />The slides after this divider will be grouped into a section and given the label you type above. Feel free to move this slide to any position in the deck.<br />
  18. 18. AS3 Glue<br />
  19. 19. Código AS3 apoiado pela Livraria Glue<br />
  20. 20. Ligações do Arduíno<br />+ <br /> a<br />- c<br />
  21. 21. No Flex Builder®<br />
  22. 22. packageexamples<br />{<br />// importação das bibliotecas do FLARManager cujo autor é EricSocolofsky http://transmote.com/flar<br />importcom.transmote.flar.FLARManager;<br />importcom.transmote.flar.marker.FLARMarker;<br />importcom.transmote.flar.marker.FLARMarkerEvent;<br />importcom.transmote.flar.utils.geom.FLARPVGeomUtils;<br />importcom.transmote.utils.time.FramerateDisplay;<br />//importação das bibliotecas de Flash<br />importflash.display.Bitmap;<br />importflash.display.Sprite;<br />importflash.events.Event;<br />importflash.events.MouseEvent;<br />importflash.events.TimerEvent;<br />importflash.filters.DropShadowFilter;<br />importflash.media.Sound;<br />importflash.media.SoundChannel;<br />importflash.net.URLRequest;<br />importflash.utils.Timer;<br />// Importação das bibliotecas do Arduino AS3 Glue<br />importnet.eriksjodin.arduino.Arduino;<br />importnet.eriksjodin.arduino.events.ArduinoEvent;<br />//Importação da Biblioteca de particulas que permite fazer nevar criada por SebLee-Delisle<br />import net.pluginmedia.pv3d.SnowStorm;<br />//Importação das bibliotecas que permitem a visualização modelo PMD 3D<br />import org.b2ox.pv3d.MikuMikuDance;<br />import org.b2ox.pv3d.MikuMikuDance.VMDController;<br />//Importação das biblioteca libspark<br />import org.libspark.flartoolkit.support.pv3d.FLARCamera3D;<br />//Importação da biblioteca papervision 3D<br />import org.papervision3d.cameras.*;<br />import org.papervision3d.lights.PointLight3D;<br />import org.papervision3d.materials.*;<br />import org.papervision3d.materials.shadematerials.PhongMaterial;<br />import org.papervision3d.materials.utils.MaterialsList;<br />import org.papervision3d.objects.DisplayObject3D;<br />import org.papervision3d.objects.parsers.DAE;<br />import org.papervision3d.objects.primitives.*;<br />import org.papervision3d.render.LazyRenderEngine;<br />import org.papervision3d.scenes.Scene3D;<br />import org.papervision3d.view.Viewport3D;<br />// A classStartAdobeAndArduino irá estender a classe sprite<br />public class StartAdobeAndArduino extends Sprite<br />{<br />// criação das variáveis que iremos precisar<br />privatevarfm:FLARManager;<br />privatevar scene:Scene3D;<br />privatevar view:Viewport3D;<br />privatevar camera:FLARCamera3D;<br />privatevarlre:LazyRenderEngine;<br />//Declaramos as variáveis que vão conter os Planos<br />privatevarplano:Plane;<br />//Declaramos as variáveis que vão conter os contentores<br />privatevar contentor:DisplayObject3D;<br />//Declaramos a variável das sombras nos objectos <br />privatevardropShadowFilter:DropShadowFilter;<br />//Declaramos a variável da neve<br />privatevarneve:SnowStorm;<br />// Declaramos as variáveis que vão conter os marcadores<br />privatevar marker0:FLARMarker;<br />privatevar marker1:FLARMarker;<br />// variáveis para os videos<br />privatevar v1:Vid;<br />//Variáveis para modelo dae<br />privatevar pointLight3D:PointLight3D;<br />privatevarphong:PhongMaterial;<br />privatevar modelContainer:DisplayObject3D;<br />privatevarmodel:DAE;<br />privatevardaeFile:String;<br />//Variáveis de som<br />privatevarmyURL:URLRequest = newURLRequest("../resources/assets/Adriana.mp3");<br />private varmySong: Sound = new Sound(myURL);<br />// variáveis para os modelos mikumikudancee<br />publicvarpmd:MikuMikuDance;<br />privatevarcontrol:VMDController;<br />// Variáveis para o arduino<br />protectedvarcircuit:Arduino;<br />//Variáveis para controlar a musica<br />protectedvarchannel:SoundChannel;<br />protectedvarsongTimer:Timer;<br />protectedvarmyDelay:Timer = newTimer(1000);<br />protectedvarPosition:Number = 0;<br />protectedvartocar:Boolean = false;<br />protectedvarligado:Boolean = false;<br />// Declaramos a moldura que vai cobrir o écran<br />[Embed(source = '../resources/assets/logo.png')] publicvarlogoCls:Class;<br />//Função principal<br />publicfunctionStartAdobeAndArduino()<br />{<br />//Criamos as variáveis que vão receber os videos damos o caminho para os videos e paramos os videos<br />//se não os mesmos começavam a tocar mesmo sem os marcadores serem detectados.<br />v1 = newVid();<br />v1.vid.source = "../resources/assets/t-rex.flv";<br />v1.vid.stop();<br />//Chamamos a função que Carrega os modelos PMD 3D bem com depois inicia a função iniFLAR() que<br />//inicia o FLARManager que é a biblioteca que permite a utilização de multiplos marcadores<br />loadingData();<br />// inicia o arduino no local host e porta 5331<br />circuit = newArduino("127.0.0.1", 5331);<br />circuit.requestFirmwareVersion();<br />circuit.addEventListener(ArduinoEvent.FIRMWARE_VERSION, iniciaarduino); // chama esta função para iniciar o código Firmata<br />}<br />privatefunctioniniciaarduino(e:ArduinoEvent):void<br />{<br />circuit.enableDigitalPinReporting(); // activa o relatório dos pinos digitais do arduino<br />circuit.setPinMode(6,Arduino.OUTPUT); // diz ao arduino que este pino é usado como saida<br />circuit.setPinMode(2,Arduino.OUTPUT);<br />circuit.setPinMode(3,Arduino.OUTPUT);<br />circuit.setPinMode(4,Arduino.OUTPUT);<br />circuit.setPinMode(5,Arduino.OUTPUT);<br />circuit.writeDigitalPin(2,Arduino.HIGH); // Manda o arduino activar este pino com 5 volts<br />
  23. 23. privatefunctionPiscaLEDs(event:TimerEvent):void{<br />if(marker0 == null)<br />{<br />if (ligado==true){<br />circuit.writeDigitalPin(2,Arduino.LOW);<br />circuit.writeDigitalPin(3,Arduino.LOW);<br />circuit.writeDigitalPin(4,Arduino.LOW);<br />circuit.writeDigitalPin(5,Arduino.LOW);<br />ligado=false;<br />}else {<br />ligado=true;<br />circuit.writeDigitalPin(2,Arduino.HIGH);<br />circuit.writeDigitalPin(3,Arduino.HIGH);<br />circuit.writeDigitalPin(4,Arduino.HIGH);<br />circuit.writeDigitalPin(5,Arduino.HIGH);<br /> }<br />}elseif (ligado==true){<br />circuit.writeDigitalPin(6,Arduino.LOW);<br />ligado=false;<br />}else {<br />ligado=true;<br />circuit.writeDigitalPin(6,Arduino.HIGH);<br /> }<br />}<br />// Função que carrega o Modelo PMD 3D<br />privatefunctionloadingData():void {<br />pmd = newMikuMikuDance();<br />pmd.loadPMD("../Data/nanoha1052.zip://nanoha1052.pmd", 15, afterLoading); // carrega o Modelo 3D e chama a função afterLoading<br />}<br />//Carrega os Movimentos do modelo PMD 3D e depois chama a função iniFLAR<br />privatefunctionafterLoading():void<br />{<br />pmd.loadVMD("../Data/motions.zip://popipo.vmd", "popipo");<br />pmd.loadVMD("../Data/motions.zip://WiM-DIVA.vmd", "test",<br />function ():void {<br />pmd.rotationX = 180;<br />pmd.rotationZ = 90;<br />pmd.scale = 1;<br />pmd.looping = true;<br />pmd.y=-50;<br />pmd.play();<br />iniFLAR(); // chamamos a função que inicia biblioteca FLARManager<br />} );<br />}<br />//Função que inicia a biblioteca FLARManager que controla os marcadores<br />privatefunctioniniFLAR():void<br />{<br />// Passamos o caminho onde está o ficheiro de configuração (xml) do FLARManager para o construtor do FLARManager<br />// O FLARManager cria e usa uma FLARCameraSource por defeito.<br />// A imagem da primeira camara detectada será usada na detecção dos Marcadores.<br />circuit.writeDigitalPin(3,Arduino.HIGH);<br />circuit.writeDigitalPin(4,Arduino.HIGH);<br />circuit.writeDigitalPin(5,Arduino.HIGH);<br />}<br />protected function ActualizaLEDS(led1:Boolean, led2:Boolean, led3:Boolean, led4:Boolean):void<br />{<br />circuit.writeDigitalPin(2,int(led1)); //escreve HIGH ou LOW conforme valor da variável led1<br />circuit.writeDigitalPin(3,int(led2));<br />circuit.writeDigitalPin(4,int(led3));<br />circuit.writeDigitalPin(5,int(led4));<br />}<br />protectedfunctionplaySong():void<br />{<br />if (tocar==false){<br />channel = mySong.play(Position); // continua a tocar apartir do ponto onde ficou<br />songTimer = newTimer(25); // faz o update dos LEDS a cada 25ms.<br />songTimer.addEventListener(TimerEvent.TIMER, ActualizaSom); // chama a função que vai ver intensidade do som<br />songTimer.start();<br />Position = channel.position;<br />tocar=true;<br />}<br />}<br />privatefunctionstopSong():void<br />{<br />Position = channel.position;// guarda posição da música antes de a parar<br />channel.stop(); // para a música<br />tocar=false;// actualiza a variável tocar<br />songTimer.stop(); // para o relógio da música<br />songTimer.removeEventListener(TimerEvent.TIMER, ActualizaSom); // chama a função que vai ver intensidade do som<br />circuit.writeDigitalPin(2,Arduino.LOW); // desliga os pinos do Arduino<br />circuit.writeDigitalPin(3,Arduino.LOW);<br />circuit.writeDigitalPin(4,Arduino.LOW);<br />circuit.writeDigitalPin(5,Arduino.LOW);<br />}<br />protectedfunctionActualizaSom(e:TimerEvent):void<br />{<br />// inicializa as variaveis para falso, de modo aos LED ficarem desligados<br />var led1:Boolean, led2:Boolean, led3:Boolean, led4:Boolean = false;<br />varavgVol:Number = ((channel.leftPeak + channel.rightPeak) / 2); // acha a media entre canal esquerdo e direito.<br />if (avgVol > .1)<br />{<br />led1 = true;<br />}<br />if (avgVol > .25)<br />{<br />led2 = true;<br />}<br />if (avgVol > .5)<br />{<br />led3 = true;<br />}<br />if (avgVol > .75)<br />{<br />led4 = true;<br />}<br />ActualizaLEDS(led1,led2,led3,led4);<br />}<br />//Função que faz piscar o LED ligado á porta 6 caso o marcador 0 esteja activo<br />//ou pisca os leds 2,3,4,5 se o marcador 0 não estiver activo<br />
  24. 24. fm = newFLARManager("../resources/flar/flarConfig.xml");<br />// Esperamos que o FLARManager inicialize antes de iniciar os motores 3D.<br />fm.addEventListener(Event.INIT, init3D);<br />// iniciamos a procura de eventos relacionados com marcadores (FLARMarkerEvents).<br />fm.addEventListener(FLARMarkerEvent.MARKER_ADDED, onAdded);<br />fm.addEventListener(FLARMarkerEvent.MARKER_REMOVED, onRemoved);<br />fm.addEventListener(FLARMarkerEvent.MARKER_UPDATED, onUpdated);<br />// adicionamos FLARManager.flarSource á lista que vai ser apresentada por forma<br />// a apresentar o video.<br />addChild(Sprite(fm.flarSource));<br />// adicionamos a moldura ao ecrán<br />varlogo:Bitmap = newlogoCls();<br />addChild(logo);<br />myDelay.addEventListener(TimerEvent.TIMER, PiscaLEDs);<br />}<br />// Função quando um marcador é encontrado adicionado<br />privatefunctiononAdded(e:FLARMarkerEvent):void<br />{<br />// se o marcador for igual ao padrão definido em flarConfig.xml<br />// então iniciar o video ou animação correspondente<br />if( e.marker.patternId==0){<br />marker0 = e.marker;<br />pmd.changeMotion("popipo");<br />pmd.visible = true;<br />contentor.visible = true;<br />pmd.play();<br />neve.visible=true;<br />playSong();<br />}<br />if( e.marker.patternId==1){<br />myDelay.start();<br />marker1 = e.marker;<br />model.visible=true;<br />modelContainer.visible=true;<br />v1.vid.play();<br />}<br />}<br />// Função quando um marcador é removido ou perdido<br />privatefunctiononRemoved(e:FLARMarkerEvent):void<br />{<br />// se o marcador for igual ao padrão definido em flarConfig.xml<br />// então parar o video ou animação correspondente<br />if( e.marker.patternId==0){<br />marker0 = null;<br />pmd.visible = false;<br />neve.visible=false;<br />stopSong();<br />}<br />if( e.marker.patternId==1){<br />marker1 = null;<br />neve.visible=false;<br />model.visible=false;<br />modelContainer.visible=false;<br />myDelay.stop();<br />circuit.writeDigitalPin(6,Arduino.LOW);<br />v1.vid.stop();<br />}<br />}<br />// Função quando um marcador é actualizado não usada<br />privatefunctiononUpdated(e:FLARMarkerEvent):void<br />{<br />trace("Update!");<br />}<br />//Função que inicia a neve<br />privatefunctioninitSnow():void<br />{<br />//Define a quantidade de neve, o tamanho dos flocos de neve, e o tamanho do cubo onde os flocos vão cair<br />neve=newSnowStorm(100, .4,2000);<br />scene.addChild(neve);<br />neve.y=1000;<br />neve.visible=false;<br />}<br />// Função que espera que o FLARManager seja iniciado antes de começar os motores 3D (librarias)<br />privatefunction init3D(e:Event):void<br />{<br />//uma vez que o FLARManager já foi iniciado retiramos a espera por esse evento<br />fm.removeEventListener(Event.INIT, init3D);<br />//Criamos a cena 3D isto é o mundo que desejamos ver<br />scene = new Scene3D();<br />// A Camera utilizada aqui é a mesma que você já conhece do cinema, ela grava o que acontece no mundo<br />// e projeta na tela (ViewPort).<br />camera = new FLARCamera3D(fm.cameraParams);<br />camera.z = -200;<br />// O Viewport3D, fazendo uma analogia à tela de cinema é onde é projetado o filme para que seja possível assistí-lo.<br />// Portanto, é uma região retangular onde é projetado a Cena 3D.<br />view = new Viewport3D(stage.stageWidth, stage.stageHeight, true,true,false, false);<br />//adicionamos ao motor 3D a cena a camara e o viewport que é a tela<br />lre = new LazyRenderEngine(scene, camera, view);<br />//Cria uma variável que adiciona sombra para o modelo collada<br />//dropShadowFilter = newDropShadowFilter(distance, angle, color, alpha, x blur, y blur, strength, quality, innershadowboolean, knockoutboolean, hideobjectboolean);<br />dropShadowFilter = newDropShadowFilter(10, 0, 0x000000, .5, 5, 5, 1, 1,true);<br />//view.filters = [filter1 to apply, filter2 to apply];<br />view.filters = [dropShadowFilter];<br />// Cria o ponto de Luz o coloca o mesmo no espaço 3D<br />pointLight3D = new PointLight3D(true);<br />pointLight3D.x = 1000;<br />pointLight3D.y = 1000;<br />pointLight3D.z = -1000;<br />//Chama a função que inicia a neve<br />initSnow();<br />// Carrega o modelo Collada (Dae).<br />// (Os modelos Collada devem ser dimensionados e rodados de modo a ficarem escalados com o marcador;<br />// atenção cada modelo é diferente<br />model = new DAE(true, "model", true);<br />model.load("../resources/assets/t-rex.dae");// terra<br />model.rotationX = 180;<br />model.rotationZ = 90;<br />model.scale = 0.70;<br />model.x= 0;<br />model.y= 0;<br />model.z= 0;<br />modelContainer = new DisplayObject3D();<br />//adiciona o modelo ao contentor<br />modelContainer.addChild(model);<br />modelContainer.visible = false;<br />// adicionamos o modemo VMD ao contentor<br />contentor = new DisplayObject3D();<br />contentor.addChild(pmd);<br />pmd.visible = false;<br />contentor.visible = false;<br />//Adicionamos os contentores á cena<br />scene.addChild(modelContainer);<br />scene.addChild(contentor);<br />//Adicionamos a luza á cena<br />scene.addChild(pointLight3D)<br />//Adicionamos tudo ao Viewport para vermos na cena<br />addChild(view);<br />// mostra o framerate para vermos a preformance pode ser retirado<br />addChild(newFramerateDisplay());<br />//Por fim chamamos um evento de entrada em cada frame e a função loop que é onde aplicamos as matrizes de transformação<br />//e efectuamos o rendering da cena completa.<br />addEventListener(Event.ENTER_FRAME, loop);<br />}<br />// inicializamos a função que se repete para sempre<br />privatefunctionloop(e:Event):void<br />{<br />neve.update(); <br />if(marker0 != null)<br />{<br />contentor.transform = FLARPVGeomUtils.convertFLARMatrixToPVMatrix(marker0.transformMatrix);//aplica a matriz de transformação<br />}<br />if(marker1 != null)<br />{<br />modelContainer.transform = FLARPVGeomUtils.convertFLARMatrixToPVMatrix(marker1.transformMatrix);<br />}<br />// Chamamos o motor de renderização<br />lre.render();<br />}<br />}<br />}<br />
  25. 25.
  26. 26. Sites úteis<br />Serproxy<br />Serialproxy 0.1.4 ( renomeado para Serproxy ) <br />http://www.cote.cc/blog/serialproxy-v014-can-use-com-ports-above-9<br />JeanPhilippe<br />AS3 Glue <br />http://code.google.com/p/as3glue/<br />ErikSjodin, eriksjodin.net<br />SnowStormparticles<br />SebLee-Delisle<br />http://www.sebleedelisle.com<br />FlarManager<br />EricSocolofsky<br />http://transmote.com/flar<br />FLARToolKit<br />Saqoosha<br />http://www.libspark.org/wiki/saqoosha/FLARToolKit/en<br />MiKuMiKuDance<br />b2ox<br />http://www.libspark.org/browser/as3/FLARMMD/trunk/src/org/b2ox/pv3d<br />Ferramentas para criar danças dos modelos 3D Miku<br />http://www.geocities.jp/higuchuu4/index_e.htm<br />email: spsantossilva@gmail.com<br />Site: http://ssweb.org/video<br />

×