如何在HoloLens 1上模拟手部光线?

时间:2019-06-18 06:55:18

标签: mrtk

我正在设置一个新项目,该项目打算同时部署到HoloLens 1和2,并且我想在两者中都使用手射线,或者至少能够在HoloLens 1上模拟它们以准备HoloLens 2。

据我所知:

  1. 将InputSimulationService定制为仅手势(这样我就可以在编辑器中进行测试)
  2. 在“ MRTK /指针”部分的“ DefaultControllerPointer选项”中添加GGVHand控制器类型。

它可以显示并响应编辑器和设备中的单击,但是它不使用手形坐标,而是从0,0,0向前进行射线广播,这表明GGV手形控制器正在提供GripPosition(当然由于HL1而没有旋转,但是没有提供“指针姿势”。

我想做到这一点的最干净的方法是向GGV Hand控制器添加一个指针姿势,或者向GripPosition添加(估计)旋转并将其用作ShellHandRayPointer中的Pose Action。我无法立即看到在MRTK中自定义/插入位置。

或者,我可以自定义DefaultControllerPointer预制件,但是由于MRTK似乎仍在频繁更改,因此我很犹豫,这可能会导致升级麻烦。

1 个答案:

答案 0 :(得分:0)

您可以创建一个自定义指针,该指针将根据手的位置来推断指针的旋转,然后像您建议的那样,对姿势操作使用Grip Pose而不是Pointer Pose

自定义指针的代码如下所示:

// Note you could extend ShellHandRayPointer if you wanted the beam bending, 
// however configuring that pointer requires careful setup of asset.
public class HL1HandRay : LinePointer
{
    public override Quaternion Rotation  
    {
        get
        {
            // Set rotation to be line from head to head, rotated a bit
            float sign = Controller.ControllerHandedness == Handedness.Right ? -1f : 1f;
            return Quaternion.Euler(0, sign * 35, 0) * Quaternion.LookRotation(Position - CameraCache.Main.transform.position, Vector3.up);
        }
    }

    // We cannot use the base IsInteractionEnabled
    // Because  HL1 hands are always set to have their "IsInPointing pose" field as false
    // You may want to do more thorough checks here, following BaseControllerPointer implementation
    public override bool IsInteractionEnabled => IsFocusLocked || IsTracked;
}

然后创建一个新的指针预制件,并将您的指针配置文件配置为使用新的指针预制件。创建自己的预制件而不是修改MRTK预制件具有确保MRTK更新不会覆盖您的预制件的优势。

enter image description here

以下是我为进行简单的指针预制而进行的一些捕获,以突出显示相关更改进行测试:

enter image description here

然后是我使用的组件:

enter image description here