如何在 HoloLens 1 上模拟手部光线?
How can I simulate hand rays on HoloLens 1?
我正在设置一个旨在部署到 HoloLens 1 和 2 的新项目,我想在两者中使用手部射线,或者至少能够在 HoloLens 1 上模拟它们以准备全息透镜 2.
据我所知是:
- 将 InputSimulationService 自定义为仅手势(以便我可以在编辑器中进行测试)
- 将 GGVHand 控制器类型添加到 MRTK/Pointers 部分中的 DefaultControllerPointer 选项。
这让它在编辑器和设备中显示并响应点击,但它不使用手坐标而是从 0,0,0 向前进行光线投射,这表明 GGV 手控制器提供了一个GripPosition(当然由于 HL1 而没有旋转)但不提供指针姿势。
我认为最简洁的方法是向 GGV 手控制器添加一个指针姿势,或向 GripPosition 添加(估计的)旋转并将其用作 ShellHandRayPointer 中的姿势动作。我无法立即在 MRTK 中看到 customize/insert 的位置。
或者,我可以自定义 DefaultControllerPointer 预制件,但我对此犹豫不决,因为 MRTK 似乎仍在频繁更改,这可能会导致升级问题。
您可以创建一个自定义指针,将指针的旋转设置为根据手的位置进行推断,然后像您建议的那样使用 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 更新不会覆盖您的预制件的优势。
以下是我为测试此功能而制作的简单指针预制件的一些截图,并突出显示了相关更改:
然后是我使用的组件:
我正在设置一个旨在部署到 HoloLens 1 和 2 的新项目,我想在两者中使用手部射线,或者至少能够在 HoloLens 1 上模拟它们以准备全息透镜 2.
据我所知是:
- 将 InputSimulationService 自定义为仅手势(以便我可以在编辑器中进行测试)
- 将 GGVHand 控制器类型添加到 MRTK/Pointers 部分中的 DefaultControllerPointer 选项。
这让它在编辑器和设备中显示并响应点击,但它不使用手坐标而是从 0,0,0 向前进行光线投射,这表明 GGV 手控制器提供了一个GripPosition(当然由于 HL1 而没有旋转)但不提供指针姿势。
我认为最简洁的方法是向 GGV 手控制器添加一个指针姿势,或向 GripPosition 添加(估计的)旋转并将其用作 ShellHandRayPointer 中的姿势动作。我无法立即在 MRTK 中看到 customize/insert 的位置。
或者,我可以自定义 DefaultControllerPointer 预制件,但我对此犹豫不决,因为 MRTK 似乎仍在频繁更改,这可能会导致升级问题。
您可以创建一个自定义指针,将指针的旋转设置为根据手的位置进行推断,然后像您建议的那样使用 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 更新不会覆盖您的预制件的优势。
以下是我为测试此功能而制作的简单指针预制件的一些截图,并突出显示了相关更改:
然后是我使用的组件: