#Hololens – How to use clases TapToPlace and InitialScanManager

Hi !

Yesterday I wrote about a custom solution I made to have Tap to Place feature in an Hololens App. The main set of features was

  • We can perform an initial scan of an environment, based on a time constraint. Also we can continue the scan process if we don’t find a minimum of number of planes for floor or wall
  • We can associate one class to an hologram to have the Tap to Place feature
  • This process also allow us to validate if we can place the hologram in a vertical (wall) or horizontal (floor) plane
  • The validation process also have some visual features like change the color of a box collider from red to green depending if we can or can’t place an object and also cast a shadow with the final location of the hologram

The “InitialScanManager.cs” is the one I use to perform the initial environment scan. I usually add this class to an Empty Game Object. The main properties to use are this ones:

  • Limit Scanning by Time and Scan Time, definen how the scan process will be performed. If we set a Scan Time value of N, and check the Limit Scan time, the app will scan the environment for N seconds and then will stop the scan process
  • Minimum Floor and Minimum Wall defines the minimum amount of frames to be searched in the floor and the wall
  • Player, this is optional for the main hologram. When the scan process start it will be hide and when the scan process ends the player will be show again
  • DebugTextPlayer, optional, a TextMesh used for debug actions

Clipboard02.png

The class “TapToPlacePlayer.cs” is the one we must associate to the element where we want this feature. The main properties are

  • Placeable Bounds and Non Placeable Bounds Materials are materials used when we start the “place mode”. I create a collider with this materials and the class change the materials based on if we can place or not the hologram at the selected position
  • Placeable Shadow and Non Placeable Shadow Materials are materials used to display the final position to be placed for the hologram
  • Display Shadow defines if we want to show (or not) the final position of the hologram
  • Placement Surface defines the positioning mode Horizontal or Vertical. I mean Floor or Wall
  • DebugTextPlayer, optional, a TextMesh used for debug actions

Clipboard04.png

The complete source code can be downloaded from GitHub (link).

Greetings @ Toronto

El Bruno

References

El Bruno, my posts

Advertisements

#Hololens – Cómo utilizar las clases TapToPlace y InitialScanManager

Hola !

En el post de ayer compartí una solución para tener las siguientes capacidades en un proyecto de Hololens

  • Realizar un scanner inicial del ambiente basado en tiempo y en cantidad de frames encontrados para piso y pared
  • Se puede iniciar un proceso de Tap to Place sobre un holograma
  • El proceso valida además si la posición a la que se quiere mover el holograma es válida.
  • La validación es en primer lugar sobre mover a planos horizontales o verticales y luego si hay espacio para el holograma

Para la acción de análisis del entorno, he creado la clase “InitialScanManager.cs”. La misma puede ser agregada en un Empty Game Object o en uno existente y las propiedades principales a tener en cuenta son:

  • Limit Scanning by Time y Scan Time, definen si el proceso de scan se realiza en base a N segundos de escaneo
  • Minimum Floor y Minimum Wall definen la cantidad mínima de frames que se deben encontrar en el suelo y en un muro
  • Player, define el holograma o grupo de hologramas que se ocultarán al comienzo del scan y se activarán al terminar el mismo
  • DebugTextPlayer, opcional, un TextMesh utilizado para acciones de Debug

Clipboard02.png

Por otra parte tenemos la clase “TapToPlacePlayer.cs”, que es debe asociarse al elemento que queremos que tenga la capacidad de “Tap to Place”.  Las propiedades principales a tener en cuenta son:

  • Placeable Bounds y Non Placeable Bounds Materials es el material con el que se mostrará un collider cuando estemos posicionando el holograma
  • Placeable Shadow y Non Placeable Shadow Materials es el material con el que se mostrará la posición final que tendrá el holograma sobre el que estamos trabajando
  • Display Shadow define si queremos utilizar las propiedades anteriores
  • Placement Surface define si queremos soportar el posicionamiento en modo horizontal o vertical, es decir en muros o en el piso
  • DebugTextPlayer, opcional, un TextMesh utilizado para acciones de Debug

Clipboard04.png

El código completo del ejemplo se puede descargar desde aquí (link).

Saludos @ Toronto

El Bruno

References

El Bruno, my posts

#Hololens – Alternative fix to the TapToPlace and WorldAnchor issue (until official #HoloToolkit release)

Hi !

If you work with Beta products you will find funny scenarios, like something working, then not working, then working again. The next Hololens forums thread is a must read if you want to understand the frustration you can get in this scenarios:

VS2017/U5.6 Crash – WinRTScriptingObjectWrapper::InternalAddRef Reference Count cannot be zero (link)

TLTR HoloToolkit current version is not officially supported for the combo Visual Studio 2017 and Unity3D 5.6. 

There are features like Tap To Place which are not working fine with VS2017 and Unity3D 5.6. If you implement this, as soon as the Hololens App starts, it will crash and close. Without any clear explanation on what´s happening. It seems to be something related to World Anchors and the way Unity are is working with this,  this issue is still alive on GitHub (link).

So, I need Tap To Place, and I decided to implement this myself. I pickup some code from HoloToolkit and some other pieces from Holographic Academy tutorials and I’ve created 2 main classes which fix the problem, and also add some additional value. Here are the main implemented features

  • We can perform an initial scan of an environment, based on a time constraint. Also we can continue the scan process if we don’t find a minimum of number of planes for floor or wall
  • We can associate one class to an hologram to have the Tap to Place feature
  • This process also allow us to validate if we can place the hologram in a vertical (wall) or horizontal (floor) plane
  • The validation process also have some visual features like change the color of a box collider from red to green depending if we can or can’t place an object and also cast a shadow with the final location of the hologram

In the next animation we can see a cylinder hologram with the following configuration:

  • Green material for the rigid box for valid place
  • Red material for the rigid box for invalid place
  • No shadows enabled

2017 04 26 Holo TapToPlace with Validation 01

The complete source code can be downloaded from GitHub (link).

Greetings @ Toronto

El Bruno

References

#Hololens – Solución al problema con TapToPlace agregando validación de planos (hasta que #HoloToolkit sea compatible)

Hola !

Cuando trabajas con productos en estado Beta puedes encontrarte con errores como el que se comenta en el siguiente post del foro:

VS2017/U5.6 Crash – WinRTScriptingObjectWrapper::InternalAddRef Reference Count cannot be zero (link)

TLTR la versión actual de HoloToolkit no está soportada por Visual Studio 2017 y Unity3D 5.6. 

En otras palabras hay funcionalidades como la de Tap To Place que al momento de lanzar una App hacen que la misma se cierre sin lanzar una excepción ni nada parecido. Parece que es por un problema de cálculo de Anchors, como comentan aquí (link).

Pues bien, tomando un poco de código deHoloToolkit y otro poco de Holographic Academy, he creado 2 clases que me permiten solucionar el problema. Por ahora soporta lo siguiente

  • Realizar un scanner inicial del ambiente basado en tiempo y en cantidad de frames encontrados para piso y pared
  • Se puede iniciar un proceso de Tap to Place sobre un holograma
  • El proceso valida además si la posición a la que se quiere mover el holograma es válida.
  • La validación es en primer lugar sobre mover a planos horizontales o verticales y luego si hay espacio para el holograma

Veamos el siguiente ejemplo. En el mismo trabajo sobre un holograma de tipo cylinder, cuando se activa el TapToPlace se crea un rigidBox para mostrar con colores si podemos posicionar o no el cilindro.

2017 04 26 Holo TapToPlace with Validation 01

El código completo del ejemplo se puede descargar desde aquí (link).

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 – Creating a menu with options with #HoloToolkit

Hello!

Comes time to perform a backup of some of the sutff I’ve learned about Hololens and HoloToolkit. This one is related to a basic feature in any app

Present a menu and select an item. In Hololens using AirTap

The idea is to view a board with different options, and the option selected will be displayed in a top 3D text

Holo Select Menu 04.gif

In previous posts I have already commented on how to create a Unity3D project and how to import the HoloToolkit. From here, the following steps would be

  • Delete default assets: Main camera & Directional light
  • Save Scene
  • Adjust UWP projects settings to be Hololens capable
    • Project Settings / Player
    • Project Settings / Quality
    • File / Build Settings
  • Import HoloToolkit
  • Add Assets
    • Main Camera
    • Spatial Mapping
    • Cursor With Feedback
  • Create Empty and Rename > Managers
    • Add Components
      • Gaze Managers
      • Gaze Stabilizer
      • Gesture Managers
      • Hands Manager
    • Add Assets
  • Create Empty and Rename > HoloCollection
    • Add Assets
      • Add Cube, add SAD image to cube
      • Add Cube, add HAPPY image to cube
      • Add Sphere, add SAD image to sphere
      • Add Sphere, add HAPPY image to sphere
      • Add 3D Text, name “TextResult”

The components hierarchy should be similar to the following

clipboard02

And now is the moment to create some interaction feature. So a single script called “EmojiSelector” will do the magic

clipboard05

In this script I would add a couple of lines in the OnSelect operation. This operation is is called from the GestureManager when performing an AirTap on a selected item. The Script obtains the item selected from the GazeManager and if it is valid, displays the name in the Text called “ResultText” 3D.

Greetings @ Toronto

El Bruno

References

#Hololens – Creando un menú con opciones con #HoloToolkit

Hola !

Llega el momento de realizar un backup de lo aprendido sobre Hololens y HoloToolkit. En este caso es relacionado a una funcionalidad de las básicas en una app

Seleccionar un elemento de un menú.

La idea es que frente a un tablero con diferentes opciones, la opción seleccionada se mostrará en un texto superior a las mismas

Holo Select Menu 04.gif

En posts anteriores ya he comentado como crear un proyecto en Unity3D y como importar el HoloToolkit. A partir de aquí, los siguientes pasos serían

  • Eliminar los assets por defect Main camera y Directional light
  • Grabar la escena
  • Ajustar los valores necesarios para que proyecto de Unity funcione como UWP en Hololens
    • Project Settings / Player
    • Project Settings / Quality
    • File / Build Settings
  • Importar HoloToolkit
  • Agregar los Assets
    • Main Camera
    • Spatial Mapping
    • Cursor With Feedback
  • Create Empty and Rename > Managers
    • Add Components
      • Gaze Managers
      • Gaze Stabilizer
      • Gesture Managers
      • Hands Manager
    • Add Assets
  • Create Empty and Rename > HoloCollection
    • Add Assets
      • Add Cube, add SAD image to cube
      • Add Cube, add HAPPY image to cube
      • Add Sphere, add SAD image to sphere
      • Add Sphere, add HAPPY image to sphere
      • Add 3D Text, name “TextResult”

En este punto la jerarquía de componentes debería quedar similar a la siguiente

clipboard02

Y llega el momento de la interacción, para esto creamos un script llamado “EmojiSelector”

clipboard05

En este script agrego un par de líneas en la operación OnSelect. Esta operación es la que se llama desde el GestureManager cuando se realiza un AirTap sobre un elemento seleccionado. El Script obtiene el elemento seleccionado desde el GazeManager y si el mismo es válido, muestra el nombre en el Text 3D llamado “ResultText”.

Saludos @ Toronto

El Bruno

References