跳转至正文

Inverse Unity 套件入门

本指南将引导您完成基本设置,并提供一个简单示例,演示Haply Inverse Unity Package的基本用法。其中包括安装该软件包、设置力反馈装置,以及编写用于力控制和位置控制的简单脚本。

有关详细内容和高级技巧,请参阅教程。

版本支持​

  • Unity 2021.3.x LTS:支持
  • Unity 2022.1.x LTS:支持
  • Unity 6000.x LTS:支持
  • Haply Inverse SDK: 3.1.0 及以上

先决条件​

  • Haply Inverse SDK 请安装 3.1.0 及以上版本。
  • Haply 请 确认Inverse Service是否正常运行。
  • 在运行该场景之前,请确认Inverse3 和VerseGrip设备已连接并完成校准。
笔记

该软件包正在持续开发中,旨在增强对Inverse3 的支持。如需支持、反馈或提出请求,请通过“联系我们”与我们联系。

安装​

Inverse Unity 包是通过Unity 的Scoped Registry提供的。要集成该包,请按照以下步骤操作:

  1. 打开“编辑”>“项目设置”>“包管理器”菜单。添加一个新的“范围注册表”,并设置以下值:

    • 姓名: Haply Robotics
    • URL: https://unitypackages.haply.co
    • 范围(Scope(s)): co.haply

    范围注册表的配置

  2. 窗口 > 软件包管理器 在菜单中 加上 点击按钮,然后 按名称添加软件包选择。 co.haply.inverse输入,然后 添加点击。

    UPM UI 快速添加

安装完成后,Inverse 软件包将显示在软件包管理器中。

触觉联赛设置​

要创建触觉装置,请依次选择“GameObject” > “Haply Inverse” > “Haptic Rig (one hand)”菜单。 此操作将创建一个包含Inverse3 控制器和VerseGrip组件的完整环境。

该场景现在包含以下内容:

  • 触觉设备映射器:Haply 根据反向服务管理设备分配。
  • “触觉源”:在场景中调整触觉设置的大小和位置。
  • 触觉控制器: Inverse3 基于VerseGrip设备的数据,控制光标的力量或位置。
  • 光标:包含用于场景表现的Inverse3 光标和VerseGrip光标 组件。

触觉联赛(单手)

有关软件包组件的详细信息,请参阅“全局架构”文档页面。

在“播放模式”下,球体(sphere)会 Inverse3 会与光标及VerseGrip的方向同步移动和旋转。

Inverse3 检查员

手柄检查器

力控制模式​

ForceControl.cs 生成 C# 脚本,并将它 触觉起源 将其连接到 GameObject 上。 使用此脚本,您可以通过检查器中的滑块来 Inverse3 可以对设备施加力。

using Haply.Inverse;
using UnityEngine;

public class ForceControl : MonoBehaviour
{
[Range(-2, 2)]
public float forceX;
[Range(-2, 2)]
public float forceY;
[Range(-2, 2)]
public float forceZ;

private Inverse3 _inverse3;

private void Awake()
{
_inverse3 = GetComponentInChildren<Inverse3>();
}

protected void OnEnable()
{
_inverse3.DeviceStateChanged += OnDeviceStateChanged;
}

protected void OnDisable()
{
_inverse3.DeviceStateChanged -= OnDeviceStateChanged;
_inverse3.Release();
}

private void OnDeviceStateChanged(object sender, Inverse3EventArgs args)
{
var inverse3 = args.DeviceController;
inverse3.SetCursorLocalForce(new Vector3(forceX, forceY, forceZ));
}
}

力控制

脚本说明​

  • forceX, Y, Z: 这是可通过滑块调节的力矢量分量。力 CursorSetForce 确保在传递给方法之前,其值保持在安全范围内。 或者标准 Vector3 也可以使用该字段。

  • Awake(): 当前在 GameObject 或其子对象中 Inverse3 加载组件。

  • OnEnable(): Awake 在调用该方法之后,以及每次脚本被激活时,都会在单独的线程中更新触觉反馈 OnDeviceStateChanged 注册回调函数。

  • OnDisable(): 当脚本被禁用或应用程序停止运行时,取消回调注册并重置能量。

  • OnDeviceStateChanged: 在检查器窗口中 force 获取向量 CursorSetForce 使用该方法 Inverse3转交至。

    重要:该回调由触觉线程以1kHz至8kHz的高频调用。 确保该回调内的所有代码均经过高度优化,这一点至关重要。

使用方法​

进入“播放模式”前,请确保已选中光标。设备应切换至“力控”状态,此时指示灯将变为绿色。 随后,您可以一边使用滑块调节力输出,一边在设备的工作空间中进行探索。

警告

调整力度后,Inverse3 将会移动。请确保工作区域为空,并始终握住光标。 有关安全指南,请参阅《安全使用说明》文档。

光标强度设置

位置控制模式​

同样,控制设备的位置的 PositionControl.cs 生成 C# 脚本,并将该脚本 触觉起源 将其连接到 GameObject 上。

using Haply.Inverse;
using UnityEngine;

public class PositionControl : MonoBehaviour
{
[Range(-0.1f, 0.1f)]
public float positionX;
[Range(-0.1f, 0.1f)]
public float positionY;
[Range(-0.1f, 0.1f)]
public float positionZ;

private Inverse3 _inverse3;

private void Awake()
{
_inverse3 = GetComponentInChildren<Inverse3>();
}

protected void OnEnable()
{
_inverse3.DeviceStateChanged += OnDeviceStateChanged;
}

protected void OnDisable()
{
_inverse3.DeviceStateChanged -= OnDeviceStateChanged;
_inverse3.Release();
}

private void OnDeviceStateChanged(object sender, Inverse3EventArgs args)
{
var inverse3 = args.DeviceController;
inverse3.SetCursorLocalPosition(inverse3.WorkspaceCenterLocalPosition + new Vector3(positionX, positionY, positionZ));
}
}

请确保ForceControl脚本或所有其他用于控制设备的脚本均已禁用。

位置控制

与之前的示例类似:

  • positionX, Y, and Z利用……在播放模式下通过滑块 位置请调整。

    已选中的 Range(-0.1, 0.1)这大致相当于可达到的最高位置。

  • Awake 方法是 Inverse3 加载组件。
  • OnEnable 方法是 Awake 在方法调用之后以及每次脚本被激活时,都会在单独的线程中进行触觉反馈的更新 OnDeviceStateChanged 注册回调函数。
  • OnDisable 当脚本被禁用或应用程序停止运行时,该方法会取消回调注册并重置状态。

但存在以下区别:

  • OnDeviceStateChanged 回调函数会在每个触觉帧中 从“检查器”窗口获取位置向量, WorkspaceCenterLocalPosition加上后, CursorSetLocalPosition 使用该方法将数据传输到Inverse3 设备。

进入播放模式前,请将光标保持在中央位置附近。 设备应切换至位置控制状态(由蓝色指示灯显示)。 然后,您可以通过滑块调整位置输出,从而在设备的工作空间内进行导航。

警告

调整位置时,Inverse3 设备会移动。请确保工作区域内没有贵重物品,并始终握住光标。 详情请参阅安全使用说明书。

设置光标位置