本文へスキップ

Inverse Unity Package の始め方

このガイドでは、基本設定の手順を説明するとともに、「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コンポーネントを含む完全な環境が作成されます。

このシーンには、以下の項目が含まれるようになりました:

  • Haptic Device Mapper:Haply Inverse Serviceに基づいてデバイスの割り当てを管理します。
  • ハプティック・オリジン:シーン内でハプティック設定のサイズと位置を調整します。
  • ハプティックコントローラー: Inverse3VerseGripデバイスのデータに基づいて、カーソルの力や位置を制御します。
  • カーソル:シーン表現用の「Inverse3 」カーソルおよび「VerseGrip」カーソルコンポーネントが含まれています。

ハプティックリーグ(片手)

パッケージの構成要素に関する詳細については、Global Architectureのドキュメントページを参照してください。

「プレイモード」では、球体(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 デバイスが動きます。作業スペースに貴重品がないことを確認し、常にカーソルを押さえておいてください。 詳細については、安全使用に関するドキュメントを参照してください。

カーソルの位置設定