Htc Vive +跳跃运动作为控制器

时间:2017-06-21 16:44:03

标签: leap-motion htc-vive

我尝试使用Unity项目上的跳跃动作实现类似于HTC Vive控制器的功能。我想用食指生成一个激光指示器,并将Vive的房间传送到激光器的位置(就像它完成了控制器一样)。问题是最新的跳跃动作(猎户座)文档,目前还不清楚。任何想法如何做到这一点?更一般地说,我们考虑使用HandController,但我们不了解添加脚本组件的位置。 谢谢!

1 个答案:

答案 0 :(得分:0)

我不清楚你所遇到的问题是你的场景中是否有手数据,或是使用手数据。

如果您只是想在场景中获取手部数据,可以从Unity SDK的一个示例场景中复制预制件。如果您正在尝试将Leap集成到已经设置VR装备的现有场景中,请查看the core Leap components上的文档,以了解需要哪些部分才能开始获取Hand数据。 LeapServiceProvider 必须位于场景中的某个位置才能接收手数据。

只要您在某处有LeapServiceProvider,就可以从任何脚本,任何地方访问Leap Motion。因此,要从索引指尖获取光线,只需将此脚本弹出任何旧位置:

using Leap;
using Leap.Unity;
using UnityEngine;

public class IndexRay : MonoBehaviour {
  void Update() {
    Hand rightHand = Hands.Right;
    Vector3 indexTipPosition = rightHand.Fingers[1].TipPosition.ToVector3();
    Vector3 indexTipDirection = rightHand.Fingers[1].bones[3].Direction.ToVector3();
    // You can try using other bones in the index finger for direction as well;
    // bones[3] is the last bone; bones[1] is the bone extending from the knuckle;
    // bones[0] is the index metacarpal bone.

    Debug.DrawRay(indexTipPosition, indexTipDirection, Color.cyan);
  }
}

对于它的价值,索引指尖方向可能不会足够稳定,无法做到你想要的。一个更可靠的策略是从相机(或理论上的“肩部位置”,从相机的恒定偏移)投射一条线穿过手的指关节骨头:

using Leap;
using Leap.Unity;
using UnityEngine;

public class ProjectiveRay : MonoBehaviour {

  // To find an approximate shoulder, let's try 12 cm right, 15 cm down, and 4 cm back relative to the camera.
  [Tooltip("An approximation for the shoulder position relative to the VR camera in the camera's (non-scaled) local space.")]
  public Vector3 cameraShoulderOffset = new Vector3(0.12F, -0.15F, -0.04F);

  public Transform shoulderTransform;

  void Update() {
    Hand rightHand = Hands.Right;
    Vector3 cameraPosition = Camera.main.transform.position;
    Vector3 shoulderPosition = cameraPosition + Camera.main.transform.rotation * cameraShoulderOffset;

    Vector3 indexKnucklePosition = rightHand.Fingers[1].bones[1].PrevJoint.ToVector3();
    Vector3 dirFromShoulder = (indexKnucklePosition - shoulderPosition).normalized;

    Debug.DrawRay(indexKnucklePosition, dirFromShoulder, Color.white);

    Debug.DrawLine(shoulderPosition, indexKnucklePosition, Color.red);
  }
}