0

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

4

1 回答 1

1

我不清楚您遇到的问题是在场景中获取手部数据,还是使用该手部数据。

如果您只是想在场景中获取手数据,您可以从 Unity SDK 的示例场景之一复制预制件。如果您尝试将 Leap 集成到已经设置了 VR 装备的现有场景中,请查看核心 Leap 组件的文档,以了解需要准备哪些部分才能开始获取手部数据。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);
  }
}
于 2017-07-09T19:29:10.857 回答