#Hololens – Lunar Module, new sample App with some very cool PreFabs for motion controllers

p1.jpg

Hi !

Last week I spent too much time between Cognitive Services and UWP. Between all this AI stuff I also put some times to try, test and understand on of the latests samples available for Hololens Developers in the Holographic Academy: Lunar Module.

The sample is very complete, the main goal is to recreate a Lunar Module game here the objective is to help the Lunar Module land safely in the Moon. We can use hand gestures or and XBox One Controller to control the lunar module. The HoloApp will also scan the environment to find a “landing plane”.

So, the cool stuff, is to go to the Github repository and review some of the assets included in the sample. I will remark 2.

Simple Menu Collection. Finally we have an easy way to create 2D interactive menus to be used in our Hololens Apps..

p2

Hand Coach, other cool one!. Every time we create and App for Hololens, there is a chance to include a tutorial on “how to use this app”, which is usually knows as a tutorial. This Prefab have some animations on how a hand can interact using gestures with holograms in the Hololens world.

P3

Happy Unity3D coding!

Greeting @ Burlington

El Bruno

References

El Bruno, my posts

Advertisements

#Hololens – Nueva Sample App: Lunar Module, excelente juego de PreFabs para motion controllers

p1.jpg

Hola!

La semana pasada entre UWP y Cognitive Services, dedique unos minutos a probar uno de los últimos ejemplos que hay en la Holographic Academy: Lunar Module.

Este ejemplo es bastante útil, se trata de controlar el descenso de un módulo lunar y utilizando nuestras manos o un XBox One Controller ayudar a que la misma aterrice de forma correcta. En este contexto, la solución se encarga de escanear el entorno para encontrar un plano lo suficientemente grande para poder aterrizar el módulo y además brinda la posibilidad de controlar el módulo.

En el repo de Github hay varios Assets, sin embargo, hay 2 que son especialmente útiles

Simple Menu Collection, al fin tenemos un asset que nos permita generar de forma rápida un menú 2D dentro de nuestro espacio en Unity para poder interactuar con el mismo.

p2

Hand Coach, otro asset que nos viene de maravilla en los proyectos de Unity. En la mayoría de apps de Unity, por lo general al comienzo de las apps hay un “modo tutorial” donde se explica cómo se interactúa con la App. Este Prefab posee una serie de animaciones en Unity con los gestos y acciones básicas que podemos hacer con las manos en una app de Hololens.

P3

Happy Unity3D coding!

Saludos @ Burlington

El Bruno

References

Windows Dev Center, Lunar Module
Windows Dev Center, Motion Controllers
GitHub, Mixed Reality Design Labs

El Bruno, my posts

#Hololens – Moving and rotating holograms using an #XBoxOne Controller

Hello!

Now that I have already connected the XBoxOne controller to the Hololens and I wrote on how to use some code to work with it, today’s post will show some of the features of the HoloToolkit class “Game Controller Manipulator“.

This class allows us to do several things, without having to add a line of code:

  • Selecting and moving a hologram in the PoV of the user of Hololens
  • Rotate a hologram on its 3-axis

Here is an example of this class in use.

2017 03 02 Holo XboxOne Controller Rotate Move 01.gif

Important: I found an error which affects the performance on a final app. I need to define the “ControllerTriggerAxis” as a new input element to be used for the Game Controller script. The following steps fix the original ones.

We start with the basics with these steps

  • Create a 3D project in Unity3D
  • Configure project to support HoloLens projects
  • Clean Scene elements
  • Import HoloToolkit package
  •  Add
    • HololensCamera
    • SpatialMapping
      • Uncheck the property “Draw Visual Meshes”
    • DefaultCursor
    • InputManager
  • Add Empty element, Managers
    • Add existing scripts
      • Game Controller Manipulator
      • Check the option “Move Gaze Target”
  • Add Empty element, HoloCollection
    • Add 3D elements
      • Cube
        • Position, x:0 y:0 z:2
        • Rotation, x:0 y:0 z:0
        • Scale, x:0.3 y:0.3 z:0.3
  • Edit – project settings – Input
    • Add element
      • Name: ControllerLeftStickX
      • Gravity: 0
      • Dead: 0.19
      • Sensitivity: 1
      • Type: Joystick Axis
      • Axis: X Axis
    • Add element
      • Name: ControllerLeftStickY
      • Gravity: 0
      • Dead: 0.19
      • Sensitivity: 1
      • Type: Joystick Axis
      • Axis: Y Axis
    • Add element
      • Name: ControllerTriggerAxis
      • Gravity: 0
      • Dead: 0.19
      • Sensitivity: 1
      • Type: Joystick Axis
      • Axis: Y Axis

The configuration of the Cube would look similar to the following image:

clipboard04

The input section would be similar to the following image:

clipboard02

Now we see a little so you can make the script Game Controller Manipulator. The first thing we see is that it has the following properties

clipboard02

In these properties we use the custom values we add in the Input for the Project settings. The 2 latest properties are also important

  • “Rotate modifier button name” indicate the name of a button on the remote control of XboxOne. Fire2 corresponds with the B button on the controller. While we hold it and move the joystick on the remote control, the hologram that this pointed to with the Gaze, will rotate on their axes, X, and y Z.
  • If you select “Move Gaze Target” when you press the button “Fire 1” (A button on the controller) we can move the hologram selected using the joystick on the remote control.

In these 2 scenarios, we see how the properties of the class define what are the elements of Input that are used to move the object of work.

Finally, comment that this class can be used in 2 ways

  • If you select the option “Move Gaze Target”, the movement and rotation apply to a hologram that is pointing the Gaze.
  • If the script is attached to an element and the “Move Gaze Target” option is not selected, move and rotate options are applied to the element

Greetings @ Toronto

El Bruno

References

#Hololens – Moviendo y rotando Hologramas usando un #XBoxOne Controller

Hola ! Ayer comenté como conectar un mando de XBoxOne a las Hololens, hoy veamos un poco de código para interactuar con el mismo. El ejemplo es simple Una vez agregada la capacidad de Spatial Mapping en el proyecto, activaremos la visualización de Mesh cuando se presione el botón A del mando de XBoxOne Por ejemplo: Empezamos por […]

Hola !

Ahora que ya tengo conectado el mando de XBoxOne a las Hololens, y escribí sobre la base para trabajar con el mismo, hoy veremos algunas de las funcionalidades de la clase “Game Controller Manipulator“, que es parte de HoloToolkit.

Esta clase nos permite hacer varias cosas, sin tener que agregar ni una línea de código:

  • Seleccionar y mover un holograma dentro del PoV del usuario de Hololens
  • Rotar un holograma sobre sus 3 ejes

Veamos un ejemplo de esta clase funcionando.

2017 03 02 Holo XboxOne Controller Rotate Move 01.gif

Importante: He encontrado un error en los pasos de configuración y he actualizado el post para solucionar los mismos.

Empezamos por lo básico con los siguientes pasos

  • Create a 3D project in Unity3D
  • Configure project to support HoloLens projects
  • Clean Scene elements
  • Import HoloToolkit package
  • Add
    • HololensCamera
    • SpatialMapping
      • Uncheck the property “Draw Visual Meshes”
    • DefaultCursor
    • InputManager
  • Add Empty element, Managers
    • Add existing scripts
      • Game Controller Manipulator
      • Check the option “Move Gaze Target”
  • Add Empty element, HoloCollection
    • Add 3D elements
      • Cube
        • Position, x:0 y:0 z:2
        • Rotation, x:0 y:0 z:0
        • Scale, x:0.3 y:0.3 z:0.3
  • Edit – project settings – Input
    • Add element
      • Name: ControllerLeftStickX
      • Gravity: 0
      • Dead: 0.19
      • Sensitivity: 1
      • Type: Joystick Axis
      • Axis: X Axis
    • Add element
      • Name: ControllerLeftStickY
      • Gravity: 0
      • Dead: 0.19
      • Sensitivity: 1
      • Type: Joystick Axis
      • Axis: Y Axis
    • Add element
      • Name: ControllerTriggerAxis
      • Gravity: 0
      • Dead: 0.19
      • Sensitivity: 1
      • Type: Joystick Axis
      • Axis: Y Axis

La configuración del Cube quedaría similar a la siguiente imagen:

Clipboard06

La sección de input quedaría similar a la siguiente imagen:

Clipboard04

Ahora veamos un poco lo que puede hacer el script Game Controller Manipulator. Lo primero que vems es que el mismo tiene la siguientes propiedades

Clipboard02

En estas props se utilizan los valores custom que agregamos en las settings de  Input del proyecto. Además las 2 últimas propiedades son importantes

  • En “Rotate modifier button name” indicamos el nombre de un botón  del mando de XboxOne. En este caso Fire2 se corresponde con el boton B. Mientras tengamos presionado el mismo y movamos los joysticks del mando, el holograma que este apuntado con el Gaze, girará sobre sus ejes X, Y y Z.
  • Si seleccionamos “Move Gaze Target”, cuando presionemos el botón “Fire 1” (botón A en el mando) podremos mover el holograma seleccionado utilizando los joysticks del mando.

En estos 2 escenarios vemos como en las propiedades de la clase se definen cuáles son los elementos de Input que se utilizan para mover el objeto de trabajo.

Finalmente  comentar que esta clase se puede utilizar de 2 formas

  • Si se selecciona la opción “Move Gaze Target”, el movimiento y rotación se aplicará al holograma al que esté apuntando el Gaze.
  • Si se asocia el script a un elemento y no se selecciona la opción “Move Gaze Target”, las opciones de mover y rotar se aplicarán al elemento

Saludos @ Toronto

El Bruno

References

#Hololens – Detect user hand interactions using #HoloToolkit (update!)

Hello!

During the last few months HoloToolkit has changed a lot. These changes make some of the examples that I have written as non-valid posts. In today’s post, I’ll quickly explain how to implement detection of hands with the current version of HoloToolkit.

We start with the basics with these steps

 

  1. Create a 3D project in Unity3D
  2. Configure project to support HoloLens projects
  3. Clean Scene elements
  4. Import HoloToolkit package
  5. Add
    1. HololensCamera
    2. SpatialMapping
    3. CursorWithFeedback
  6. Add Empty element, Managers
    1. Add existing scripts
      1. Gaze Managers
      2. Gaze Stabilizer
      3. Input Manager
  7. Add Empty element, HoloCollection
    1. Add 3D elements
      1. Cube
        1. Position, x:0 y:0 z:2
        2. Rotation, x:0 y:0 z:0
        3. Scale, x:0.3 y:0.3 z:0.3
      2. AnchorText (from HoloToolkit)
        1. Position, x:0 y:0.35 z:2
        2. Rotation, x:0 y:0 z:0
        3. Scale, x:0.3 y:0.3 z:0.3
  8. Into the Manager collection
    1. Add script Text Debug Manager (later on the post)
      1. Drag the Anchor Text (7.1.2) into the Anchor Debug Text Property

This is the process creating a basic Hololens project. Now let’s create a script that detects any of the user actions with his hands. This script will display these actions in the AnchorText which I have added to the collection of holograms in debug mode.

For this example, I will call the script “TextDebugManager.cs“. The same code is as follows

 

using HoloToolkit.Unity.InputModule;
using UnityEngine;

public class TextDebugManager : MonoBehaviour, IHoldHandler, IInputHandler
{

 public TextMesh AnchorDebugText;
 private string _debugTextHold = "";
 private string _debugTextInput = "";
 
 void Update()
 {
   UpdateText();
 }

 private void UpdateText()
 {
   if (AnchorDebugText != null)
     AnchorDebugText.text = string.Format(
       "Hold: {0}\nInput: {1}", _debugTextHold, _debugTextInput);
 }

 public void OnHoldStarted(HoldEventData eventData)
 {
   _debugTextHold = "OnHoldStarted";
 }

 public void OnHoldCompleted(HoldEventData eventData)
 {
   _debugTextHold = "OnHoldCompleted";
 }

 public void OnHoldCanceled(HoldEventData eventData)
 {
   _debugTextHold = "OnHoldCanceled";
 }

 public void OnInputUp(InputEventData eventData)
 {
   _debugTextInput = "OnInputUp";
 }

 public void OnInputDown(InputEventData eventData)
 {
   _debugTextInput = "OnInputDown";
 }
}

Within the class I implemented interfaces “IHoldHandle” and “IInputHandler“. Then be shown the operations be interfaces in the Update() of the script. In this way, we can implement a model of Debug PPP of Hololens in a quick way, and in this case, to capture the interactions of the user about the holograms.

Greetings @ TorontoEl Bruno

References

#Hololens – Detectando interacciones con las manos utilizando #HoloToolkit (actualización!)

Hola !
Durante estos ultimos meses HoloToolkit ha cambiado mucho. Estos cambios hacen que algunos de los ejemplos que he escrito ya no sean válidos. En el post de hoy, explicaré rápidamente como implementar la detección de manos con la versión actual de HoloToolkit.

Hola !

Durante estos ultimos meses HoloToolkit ha cambiado mucho. Estos cambios hacen que algunos de los ejemplos que he escrito ya no sean válidos. En el post de hoy, explicaré rápidamente como implementar la detección de manos con la versión actual de HoloToolkit.

Empezamos por lo básico con los siguientes pasos

  1. Create a 3D project in Unity3D
  2. Configure project to support HoloLens projects
  3. Clean Scene elements
  4. Import HoloToolkit package
  5. Add
    1. HololensCamera
    2. SpatialMapping
    3. CursorWithFeedback
  6. Add Empty element, Managers
    1. Add existing scripts
      1. Gaze Managers
      2. Gaze Stabilizer
      3. Input Manager
  7. Add Empty element, HoloCollection
    1. Add 3D elements
      1. Cube
        1. Position, x:0 y:0 z:2
        2. Rotation, x:0 y:0 z:0
        3. Scale, x:0.3 y:0.3 z:0.3
      2. AnchorText (from HoloToolkit)
        1. Position, x:0 y:0.35 z:2
        2. Rotation, x:0 y:0 z:0
        3. Scale, x:0.3 y:0.3 z:0.3
  8. Into the Manager collection
    1. Add script Text Debug Manager (later on the post)
      1. Drag the Anchor Text (7.1.2) into the Anchor Debug Text Property

Este es el proceso básico de creación de un proyecto de Hololens, lo que haremos ahora es crear un script que detecte alguna de las acciones con las manos del usuario de Hololens. Este script mostrará en modo debug estas acciones en el AnchorText que he agregado a la colección de Hologramas.

Para este ejemplo llamaré al script “TextDebugManager.cs“. El código del mismo es el siguiente

using HoloToolkit.Unity.InputModule;
using UnityEngine;

public class TextDebugManager : MonoBehaviour, IHoldHandler, IInputHandler
{

 public TextMesh AnchorDebugText;
 private string _debugTextHold = "";
 private string _debugTextInput = "";
 
 void Update()
 {
   UpdateText();
 }

 private void UpdateText()
 {
   if (AnchorDebugText != null)
     AnchorDebugText.text = string.Format(
       "Hold: {0}\nInput: {1}", _debugTextHold, _debugTextInput);
 }

 public void OnHoldStarted(HoldEventData eventData)
 {
   _debugTextHold = "OnHoldStarted";
 }

 public void OnHoldCompleted(HoldEventData eventData)
 {
   _debugTextHold = "OnHoldCompleted";
 }

 public void OnHoldCanceled(HoldEventData eventData)
 {
   _debugTextHold = "OnHoldCanceled";
 }

 public void OnInputUp(InputEventData eventData)
 {
   _debugTextInput = "OnInputUp";
 }

 public void OnInputDown(InputEventData eventData)
 {
   _debugTextInput = "OnInputDown";
 }
}

Dentro de la clase he implementado las interfaces “IHoldHandle“ e “IInputHandler“.  Luego se muetran las operaciones de estar interfaces en el Update() del script. De esta forma, podemos implementar un modelo de Debug en una app de Hololens de una forma rápida, y en este caso, para capturar las interacciones del usuario sobre los Hologramas.

Saludos @ Toronto

El Bruno

References

#Hololens – How to detect AirTap and Click actions using #HoloToolkit (updated!)

Hola ! Ayer comenté como conectar un mando de XBoxOne a las Hololens, hoy veamos un poco de código para interactuar con el mismo. El ejemplo es simple Una vez agregada la capacidad de Spatial Mapping en el proyecto, activaremos la visualización de Mesh cuando se presione el botón A del mando de XBoxOne Por ejemplo: Empezamos por […]

Hello!

During the last few months, HoloToolkit has evolved a lot. Some of the changes in the Toolkit make some of my blog samples as non-valid. For example, basic actions such as detecting an AirTap. In today’s post, I’ll quickly explain how to implement the AirTap or Click.

We start with the basics with these steps

  • Create a 3D project in Unity3D
  • Configure project to support HoloLens projects
  • Clean Scene elements
  • Import HoloToolkit package
  • Add
    • HololensCamera
    • SpatialMapping
    • CursorWithFeedback
  • Add Empty element, Managers
    • Add existing scripts
      • Gaze Managers
      • Gaze Stabilizer
      • Input Manager
  • Add Empty element, HoloCollection
    • Add 3D elements
      • Cube
        • Position, x:0 y:0 z:2
        • Rotation, x:0 y:0 z:0
        • Scale, x:0.3 y:0.3 z:0.3

This is the basic process to create a Hololens project in Unity3D.  Now let’s associate a script to the Cube that detects some user actions of the user, such as for example the AirTap. For this example, I will call the script “CubeManager.cs“. This is the source code of the script:

using HoloToolkit.Unity.InputModule;
using UnityEngine;

public class CubeManager : MonoBehaviour, IInputClickHandler, IInputHandler
{
  public void OnInputClicked(InputClickedEventData eventData)
  {
    // AirTap code goes here
  }
  public void OnInputDown(InputEventData eventData)
  { }
  public void OnInputUp(InputEventData eventData)
  { }
}

To capture AirTaps actions, we need to implement the “IInputClickHandler” interface. In the OnInputClicked(InputClickedEventData eventData) method we can perform actions when the user AirTap on the element. In the same way, if we implement the interface “IInputHandler” we can capture events “Click/Tap Down” and “Click/Tap Up” in an element of our app.

Note: Besides the AirTap action, this example serves to Click action on the Hololens clicker.

IMHO, I find it a much more ‘clean’ way this way of working with events using interfaces. Although there is still a way to go. In my next post, I will show how to work with hands and Hololens, for this sample the approach is not interface driven.

The sample code can be downloaded from GitHub (link)

Greetings @ Toronto

El Bruno

References

#Hololens – Detectando acciones de AirTap y Click con #HoloToolkit (actualización!)

Hola ! Ayer comenté como conectar un mando de XBoxOne a las Hololens, hoy veamos un poco de código para interactuar con el mismo. El ejemplo es simple Una vez agregada la capacidad de Spatial Mapping en el proyecto, activaremos la visualización de Mesh cuando se presione el botón A del mando de XBoxOne Por ejemplo: Empezamos por […]

Hola !

Durante estos ultimos meses HoloToolkit ha cambiado mucho. Estos cambios hacen que algunos de los ejemplos que he escrito ya no sean válidos. Por ejemplo, acciones básicas como detectar un AirTap. En el post de hoy, explicaré rápidamente como implementar el AirTap o Click.

Empezamos por lo básico con los siguientes pasos

  • Create a 3D project in Unity3D
  • Configure project to support HoloLens projects
  • Clean Scene elements
  • Import HoloToolkit package
  • Add
    • HololensCamera
    • SpatialMapping
    • CursorWithFeedback
  • Add Empty element, Managers
    • Add existing scripts
      • Gaze Managers
      • Gaze Stabilizer
      • Input Manager
  • Add Empty element, HoloCollection
    • Add 3D elements
      • Cube
        • Position, x:0 y:0 z:2
        • Rotation, x:0 y:0 z:0
        • Scale, x:0.3 y:0.3 z:0.3

Este es el proceso básico de creación de un proyecto de Hololens, lo que haremos ahora es asociar un script al cubo que detecte algunas acciones del usuario, como por ejemplo el AirTap. Para este ejemplo llamaré al script “CubeManager.cs“. El código del mismo es el siguiente

using HoloToolkit.Unity.InputModule;
using UnityEngine;

public class CubeManager : MonoBehaviour, IInputClickHandler, IInputHandler
{
  public void OnInputClicked(InputClickedEventData eventData)
  {
    // AirTap code goes here
  }
  public void OnInputDown(InputEventData eventData)
  { }
  public void OnInputUp(InputEventData eventData)
  { }
}

Como podemos ver la forma de capturar AirTaps, es implementando la interfaz “IInputClickHandler“. En el método  OnInputClicked(InputClickedEventData eventData) podremos realizar acciones cuando el usuario haga AirTap sobre el cubo. De la misma forma si implementamos la interfaz “IInputHandler” podremos capturar los eventos “Click/Tap Down” y “Click/Tap Up” en un elemento de nuestra app.

Nota: Además de la acción AirTap, este ejemplo sirve para la acción de Click en el clicker de Hololens.

Personalmente me parece una forma mucho más “limpia” esta forma de trabajar con eventos utilizando interfaces. Aunque todavía hay camino para andar. En el siguiente post veremos como trabajar con las manos, ya que el enfoque no es orientado a interfaces.

El código de ejemplo se puede descargar desde GitHub (link)

Saludos @ Toronto

El Bruno

References

#Hololens – Fire Buttons actions with a #XBoxOne Controller

Hola ! Ayer comenté como conectar un mando de XBoxOne a las Hololens, hoy veamos un poco de código para interactuar con el mismo. El ejemplo es simple Una vez agregada la capacidad de Spatial Mapping en el proyecto, activaremos la visualización de Mesh cuando se presione el botón A del mando de XBoxOne Por ejemplo: Empezamos por […]

Hello!

Yesterday I wrote on how to connect an XBoxOne controller to a Hololens. Today I’ll share a bit of code on how to interact with the device. The example is simple

Once added the ability of Spatial Mapping in the project, we will activate the display of Visual Mesh when you press button A on the XBoxOne remote control

For example:

 

2017-03-01-holo-xboxone-controller-03

We started with the basics, creating a project vacuum in Unity3D and following these steps

  • Configure project to support HoloLens projects
  • Clean Scene elements
  • Import HoloToolkit package
  • Add
    • HololensCamera
    • SpatialMapping
    • CursorWithFeedback
  • Add Empty element, Managers
    • Add existing scripts
      • Gaze Managers
      • Gaze Stabilizer
      • Input Manager
    • Add new empty script
      • XboxControllerManager

After completion of the project would be similar to the following:

Clipboard02.jpg

Now we see the code required for the “XboxControllerManager” script. We will work on the Update(): check for button A pressed state, and let’s add that state to the DrawVisualMeshes property of the active instance of Spatial Mapping.

clipboard04

Done! This is good enough for a sample, although here it is convenient to study a bit about concepts that handles Unity for the “Inputs” (see references). In this case, in the project properties, we can see the basic settings for projects 3D in Unity in this aspect. And the main class for the States of the buttons on the remote control to access is UnityEngine.Input.

In the next post, when working with a kind of HoloToolkit for control of Xbox, comment the changes needed to make it work properly.

The source of the example source code can be downloaded from link.

Greetings @ Toronto

El Bruno

References

#Hololens – Capturando Fire Buttons events de un #XBoxOne Controller

Hola !

Ayer comenté como conectar un mando de XBoxOne a las Hololens, hoy veamos un poco de código para interactuar con el mismo. El ejemplo es simple

Una vez agregada la capacidad de Spatial Mapping en el proyecto, activaremos la visualización de Mesh cuando se presione el botón A del mando de XBoxOne

Por ejemplo:

2017-03-01-holo-xboxone-controller-03

Empezamos por lo básico, creando un proyecto vacio en Unity3D y siguiendo los siguientes pasos

  • Configure project to support HoloLens projects
  • Clean Scene elements
  • Import HoloToolkit package
  • Add
    • HololensCamera
    • SpatialMapping
    • CursorWithFeedback
  • Add Empty element, Managers
    • Add existing scripts
      • Gaze Managers
      • Gaze Stabilizer
      • Input Manager
    • Add new empty script
      • XboxControllerManager

Una vez finalizado el proyecto quedaría similar al siguiente:

Clipboard02.jpg

Ahora nos queda ver el código necesario del script “XboxControllerManager”. En el mismo verificaremos en el Update() si el botón A está presionado, y asociaremos ese estado a la propiedad DrawVisualMeshes de la instacia activa de Spatial Mapping.

clipboard04

Y listo ! Como ejemplo sirve, aunque aquí es conveniente estudiar un poco sobre los conceptos que maneja Unity para los “Inputs” (ver referencias). En este caso, en las propiedades del proyecto podemos ver la configuración básica para los proyectos 3D en Unity en este aspecto. Y la clase principal para acceder a los estados de los botones del mando es UnityEngine.Input.

En el próximo post, cuando trabaje con una clase de HoloToolkit para el mando de Xbox, comentaré los cambios necesarios para que la misma funcione correctamente.

El código fuente del ejemplo se puede descargar desde link.

Saludos @ Toronto

El Bruno

References