Gaaaaaaaa
Gaaaaaaaa

Reputation: 167

is there anyway to detect which part of hand is touching the object in interaction engine (Leap Motion & Unity3D)

I am trying to build a application which includes using leap motion interaction engine to move the object in unity 3d. However, i also need to find out which fingers are touching the object when interacting with object in unity. Is there anyway i can do that? Thanks in advance!!

Upvotes: 0

Views: 1200

Answers (1)

vab
vab

Reputation: 177

Strictly speaking, the Grasping logic of the Interaction Engine has to check this very thing in order to initiate or release grasps, but it doesn't have a friendly API for accessing this information.

A more convenient way to express this, even though it's not the most efficient way, would be to detect when a hand is intersecting with the interaction object and checking the distance between each fingertip and the object.

All InteractionControllers that are intersecting with a given InteractionBehaviour can be accessed via its contactingControllers property; using the Query library included in Leap tools for Unity, you can convert a bunch of Interaction Controller references to a bunch of Leap Hands without too much effort, and then perform the check:

using Leap.Unity;
using Leap.Unity.Interaction;
using Leap.Unity.Query;
using UnityEngine;

public class QueryFingertips : MonoBehaviour {

  public InteractionBehaviour intObj;

  private Collider[] _collidersBuffer = new Collider[16];
  private float _fingertipRadius = 0.01f; // 1 cm

  void FixedUpdate() {
    foreach (var contactingHand in intObj.contactingControllers
                                         .Query()
                                         .Select(controller => controller.intHand)
                                         .Where(intHand => intHand != null)
                                         .Select(intHand => intHand.leapHand)) {

      foreach (var finger in contactingHand.Fingers) {
        var fingertipPosition = finger.TipPosition.ToVector3();

        // If the distance from the fingertip and the object is less
        // than the 'fingertip radius', the fingertip is touching the object.
        if (intObj.GetHoverDistance(fingertipPosition) < _fingertipRadius) {
          Debug.Log("Found collision for fingertip: " + finger.Type);
        }
      }
    }
  }

}

Upvotes: 1

Related Questions