1

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

据我所知是:

  1. 将 InputSimulationService 自定义为仅手势(因此我可以在编辑器中进行测试)
  2. 将 GGVHand 控制器类型添加到 MRTK/Pointers 部分的 DefaultControllerPointer 选项。

这让它显示并响应编辑器和设备中的点击,但它不使用手坐标,而是从 0,0,0 向前投射,这表明 GGV 手控制器正在提供 GripPosition(当然有由于 HL1 没有旋转)但没有提供指针姿势。

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

或者,我可以自定义 DefaultControllerPointer 预制件,但我犹豫是否这样做,因为 MRTK 似乎仍在频繁更改,这可能会导致升级问题。

4

1 回答 1

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 更新不会覆盖您的预制件的优势。

在此处输入图像描述

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

在此处输入图像描述

然后是我使用的组件:

在此处输入图像描述

于 2019-06-19T10:03:46.163 回答