{"id":1660,"date":"2014-10-01T10:54:46","date_gmt":"2014-10-01T08:54:46","guid":{"rendered":"https:\/\/inlab.fib.upc.edu\/?p=1660"},"modified":"2014-10-01T10:54:46","modified_gmt":"2014-10-01T08:54:46","slug":"interaccion-3d-con-leap-motion","status":"publish","type":"post","link":"https:\/\/inlab.fib.upc.edu\/es\/uncategorized-ca\/interaccion-3d-con-leap-motion","title":{"rendered":"Interacci\u00f3n 3D con Leap Motion"},"content":{"rendered":"<p><strong>LeapMotion <\/strong>permite la <strong>interacci&oacute;n <\/strong>entre el <strong>usuario y el ordenador mediante gestos en el espacio<\/strong>, consiguiendo una nueva experiencia de usuario muy diferente a la habitual con la interacci&oacute;n a trav&eacute;s del teclado y rat&oacute;n. As&iacute; pues, LeapMotion <strong>permitir&aacute; interactuar <\/strong>con gestos en la demostraci&oacute;n del <strong>proyecto NECADA.<\/strong><\/p>\n<p><!--more--><\/p>\n<p>En esta entrada os presentamos Leap Motion, el &uacute;ltimo dispositivo HMI (Human Machine Interface) con el que estamos trabajando en el inLab. LeapMotion permite la interacci&oacute;n entre el usuario y el ordenador mediante gestos en el espacio, consiguiendo una nueva experiencia de usuario muy diferente a la habitual con la interacci&oacute;n a trav&eacute;s del teclado y rat&oacute;n. As&iacute; pues, a trav&eacute;s del LeapMotion ser&aacute; posible interactuar con gestos en la demostraci&oacute;n del proyecto NECADA.<\/p>\n<p>Hasta ahora la forma m&aacute;s com&uacute;n de interactuar con nuestros ordenadores ha sido el rat&oacute;n y el teclado, pero poco a poco vemos, con la introducci&oacute;n de smartphones y tablets, como la forma de interactuar est&aacute; cambiando y buscando nuevas formas de interactuar es donde entra Leap Motion.<\/p>\n<p>Leap Motion es un sensor de movimiento que nos permite controlar el ordenador mediante gestos que realizamos en el aire. Est&aacute; formado por una parte hardware y otra de software.<\/p>\n<p>El hardware de Leap Motion est&aacute; formado por un peque&ntilde;o aparato, compuesto por 2 c&aacute;maras e infrarrojos. &nbsp;Este aparato detecta ambas manos, con sus respectivos dedos, junto con el antebrazo del usuario.<\/p>\n<p>La parte de software recibe los datos del sensor y analiza para obtener la informaci&oacute;n sobre las manos, dedos, brazos y herramientas (puntero). El software contiene un modelo interno de una mano y lo compara con los datos que recibe para obtener la informaci&oacute;n lo m&aacute;s precisa posible.<\/p>\n<h2>&iquest;C&oacute;mo empezar a usarlo?<\/h2>\n<p>Para empezar a utilizar Leap Motion simplemente basta con conectar el controlador mediante un usb a nuestro ordenador e instalar un software que podemos encontrar en su p&aacute;gina <a href=\"https:\/\/www.leapmotion.com\/setup\" target=\"_blank\" rel=\"noopener\">web<\/a>.<\/p>\n<p>Con dicho software viene &nbsp;&ldquo;Airpace&rdquo; que tiene una serie de aplicaciones preinstaladas con las que poder empezar a probar Leap Motion.<\/p>\n<p>Leap Motion funciona mediante las aplicaciones que se encuentran en la &ldquo;Airspace Store&rdquo;, la cual funciona como una tienda de aplicaciones donde los usuarios pueden encontrar todo tipo de aplicaciones: juegos, musicales&hellip; entre las que tambi&eacute;n se encuentran algunas para poder utilizar el ordenador mediante gestos.<\/p>\n<h2>&iquest;C&oacute;mo crear una&nbsp; aplicaci&oacute;n?<\/h2>\n<p>Si queremos desarrollar nuestros propios proyectos con Leap Motion, podemos realizar en distintos entornos de desarrollo:<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\" size-full wp-image-1654\" alt=\"\" src=\"https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2014\/10\/leapmotion2.png\" style=\"width: 604px; height: 100px;\" width=\"960\" height=\"159\" srcset=\"https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2014\/10\/leapmotion2.png 960w, https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2014\/10\/leapmotion2-300x50.png 300w, https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2014\/10\/leapmotion2-768x127.png 768w, https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2014\/10\/leapmotion2-370x61.png 370w\" sizes=\"(max-width: 960px) 100vw, 960px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>En nuestro caso nos hemos decantado por Unity\/C#.<\/p>\n<p>Lo primero que deberemos hacer es descargar el <a href=\"https:\/\/developer.leapmotion.com\/\" target=\"_blank\" rel=\"noopener\">sdk de Leap Motion<\/a>&nbsp;y una vez descargado copiar las siguientes librer&iacute;as a la carpeta ra&iacute;z de nuestro proyecto:<\/p>\n<p>En Windows:<\/p>\n<p><span style=\"font-family:courier new,courier,monospace;\">x86\/LeapCSharp.dll<br \/>\nx86\/Leap.dll<\/span><\/p>\n<p>En Mac:<\/p>\n<p><span style=\"font-family:courier new,courier,monospace;\">libLeapCSharp.dylib<br \/>\nlibLeap.dylib<\/span><\/p>\n<p>En la carpeta de Assets copiar: LeapCSharp.NET.3.5.dll.<\/p>\n<p>Una vez tengamos descargado el sdk y todo puesto donde toca, hemos de tener en cuenta que el software de Leap Motion obtiene la informaci&oacute;n &ldquo;Frame by Frame&rdquo; y es este &ldquo;Frame&rdquo; el que contiene toda la informaci&oacute;n de nuestras manos (posici&oacute;n, orientaci&oacute;n, velocidad&hellip;).<\/p>\n<p>En nuestro caso como utilizaremos Unity, utilizaremos la funci&oacute;n &ldquo;Update()&rdquo; que es llamada autom&aacute;ticamente por Unity a cada frame para obtener el &ldquo;Frame&rdquo; de Leap Motion.<\/p>\n<p>He aqu&iacute; un peque&ntilde;o ejemplo de como acceder a la API de Leap Motion ser&iacute;a:<\/p>\n<pre class=\"brush:c#\">\r\nusing UnityEngine;\r\nusing System.Collections;\r\nusing Leap;\r\npublic class LeapBehavior : MonoBehaviour {\r\n\r\n    Controller controller;\r\n    void Start ()\r\n    {\r\n        controller = new Controller();\r\n    }\r\n\r\n    void Update ()\r\n    {\r\n        Frame frame = controller.Frame();\r\n        \/\/&hellip;\r\n    }\r\n}<\/pre>\n<p>Las partes m&aacute;s importantes de este c&oacute;digo son:<\/p>\n<p><span style=\"font-family:courier new,courier,monospace;\">Using Leap:<\/span> Se encarga de acceder a la API de Leap Motion<br \/>\n<span style=\"font-family:courier new,courier,monospace;\">Controller:<\/span> Representa el controlador del Leap Motion, que nos da la informaci&oacute;n, por eso debe ser llamado al principio de todo siempre.<br \/>\n<span style=\"font-family:courier new,courier,monospace;\">Frame frame = controller.Frame()<\/span>: nos da la informaci&oacute;n del &ldquo;Frame&rdquo; actual i a partir de este obtener la informaci&oacute;n que queremos.<\/p>\n<p>A partir del frame podemos obtener distinta informaci&oacute;n como:<\/p>\n<p><span style=\"font-family:courier new,courier,monospace;\">Hands:<\/span> Informaci&oacute;n de las manos, la identidad (derecha o izquierda), la posici&oacute;n, orientaci&oacute;n, velocidad, una lista con los dedos asociados a la mano&hellip;<br \/>\n<span style=\"font-family:courier new,courier,monospace;\">Arm:<\/span> Informaci&oacute;n del brazo, tama&ntilde;o, orientaci&oacute;n&hellip;<br \/>\n<span style=\"font-family:courier new,courier,monospace;\">Fingers:<\/span> &nbsp;Informaci&oacute;n de cada dedo de una mano, son identificados por nombre y se puede obtener la direcci&oacute;n y posici&oacute;n. Adem&aacute;s podemos obtener informaci&oacute;n de cada uno de los huesos:<br \/>\n<span style=\"font-size: 13px; line-height: 1.6em;\">&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"font-family:courier new,courier,monospace;\">Bone:<\/span> Describe la posici&oacute;n y orientaci&oacute;n de cada uno de los huesos de la mano.<\/span><\/p>\n<pre>\r\n<img decoding=\"async\" class=\" size-full wp-image-1657\" alt=\"\" src=\"https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2014\/10\/leapmotion3.png\" style=\"height:400px; width:500px\" width=\"587\" height=\"414\" srcset=\"https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2014\/10\/leapmotion3.png 587w, https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2014\/10\/leapmotion3-300x212.png 300w, https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2014\/10\/leapmotion3-370x261.png 370w\" sizes=\"(max-width: 587px) 100vw, 587px\" \/><\/pre>\n<p>&nbsp;<\/p>\n<p>Adem&aacute;s podemos detectar distintos gestos (Gesture en Leap Motion API) predefinidos como:<\/p>\n<p>Circle: Dibujar un circulo en el aire.<br \/>\nSwipe: Movimiento lineal con la mano y dedos.<br \/>\nKey Tap: Movimiento como si pulsara un bot&oacute;n de un teclado.<br \/>\nScreen Tap: Movimiento como si pulsara sobre la pantalla.<\/p>\n<p>Mostraremos un peque&ntilde;o ejemplo de c&oacute;mo utilizar gestos, en nuestro caso el de &ldquo;Circle&rdquo;:<\/p>\n<p>Primero de todo, como hemos indicado antes necesitaremos tener el controlador, y habilitaremos el gesto que queremos utilizar (podemos habilitar m&aacute;s de uno).<\/p>\n<p><span style=\"font-family:courier new,courier,monospace;\">controller.EnableGesture(Gesture.GestureType.TYPE_CIRCLE);<\/span><\/p>\n<p>Luego podr&iacute;amos configurar los par&aacute;metros de c&oacute;mo queremos que sea el gesto.<\/p>\n<p><span style=\"font-family:courier new,courier,monospace;\">controller.Config.SetFloat(&quot;Gesture.Circle.MinRadius&quot;, 10.0f);<\/span><\/p>\n<p><span style=\"font-family:courier new,courier,monospace;\">controller.Config.SetFloat(&quot;Gesture.Circle.MinArc&quot;, .5f);<\/span><\/p>\n<p><span style=\"font-family:courier new,courier,monospace;\">controller.Config.Save();<\/span><\/p>\n<p>M&aacute;s adelante a cada frame obtendremos los gestos que Leap Motion haya detectado.<\/p>\n<p><span style=\"font-family:courier new,courier,monospace;\">GestureList gesturesInFrame = frame.Gestures();<\/span><\/p>\n<p>Y ejecutaremos el caso que queramos.<\/p>\n<pre class=\"brush:c#\">\r\nif (!gesturesInFrame.IsEmpty) {\r\n    foreach (Gesture gesture in gesturesInFrame) {\r\n        switch (gesture.Type) {\r\n            case Gesture.GestureType.TYPECIRCLE:\r\n            \/\/Handle circle gestures\r\n            break;\r\n            case Gesture.GestureType.TYPEKEYTAP:\r\n            \/\/Handle key tap gestures\r\n            break;\r\n            case Gesture.GestureType.TYPESCREENTAP:\r\n            \/\/Handle screen tap gestures\r\n            break;\r\n            case Gesture.GestureType.TYPESWIPE:\r\n            \/\/Handle swipe gestures\r\n            break;\r\n            default:\r\n            \/\/Handle unrecognized gestures\r\n            break;\r\n        }\r\n    }\r\n}<\/pre>\n<p>Al usar un switch podremos controlar todos los gestos que queramos utilizar, siempre acord&aacute;ndonos de habilitar-lo primero.<\/p>\n<p>Esto ser&iacute;a lo m&aacute;s b&aacute;sico para empezar a crear nuestra aplicaci&oacute;n con Leap Motion y Unity a partir de aqu&iacute;, se pueden probar distintas <a href=\"https:\/\/developer.leapmotion.com\/documentation\/skeletal\/csharp\/devguide\/Unity_Demo_Pack.html\" target=\"_blank\" rel=\"noopener\">demos<\/a> que nos ofrecen ellos y mirar algunas <a href=\"https:\/\/developer.leapmotion.com\/documentation\/skeletal\/csharp\/devguide\/Unity_Boilerplate.html\" target=\"_blank\" rel=\"noopener\">librer&iacute;as<\/a> de ayuda.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>LeapMotion permite la interacci&oacute;n entre el usuario y el ordenador mediante gestos en el espacio, consiguiendo una nueva experiencia de usuario muy diferente a la habitual con la interacci&oacute;n a trav&eacute;s del teclado y rat&oacute;n. As&iacute; pues, LeapMotion permitir&aacute; interactuar con gestos en la demostraci&oacute;n del proyecto NECADA.<\/p>\n","protected":false},"author":594,"featured_media":1651,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"experteses":[],"class_list":["post-1660","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized-ca"],"acf":[],"_links":{"self":[{"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/posts\/1660","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/users\/594"}],"replies":[{"embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/comments?post=1660"}],"version-history":[{"count":0,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/posts\/1660\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/media\/1651"}],"wp:attachment":[{"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/media?parent=1660"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/categories?post=1660"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/tags?post=1660"},{"taxonomy":"experteses","embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/experteses?post=1660"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}