メインコンテンツまでスキップ

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. Edit > Project Settings > Package Manager を開きます。次の内容で、新しい Scoped Registry を追加します。

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

    scoped-registry

  2. Window > Package Manager を開き、add + ボタンをクリックして、Add package by name を選択します。 co.haply.inverse と入力し、Add をクリックします。

    upm-ui-quick-add

インストールが完了すると、パッケージマネージャーに Inverse パッケージが表示されます。

ハプティックリグのセットアップ​

ハプティックリグを作成するには、GameObject > Haply Inverse > Haptic Rig (one hand) に移動します。 この操作により、Inverse3 コントローラーと VerseGrip を含む完全な環境が組み立てられます。

シーンには次のものが含まれるようになります。

  • Haptic Device Mapper: Haply Inverse Service を使用して、デバイスの割り当てを管理します。
  • Haptic Origin: シーン内でハプティックセットアップの拡大縮小と配置を行います。
  • Haptic Controller: Inverse3 と VerseGrip のデバイスデータに基づいて、カーソルの力または位置を管理します。
  • Cursor: シーンの表示用に、Inverse3 Cursor と VerseGrip Cursor のコンポーネントを含みます。

haptic-rig

パッケージのコンポーネントの詳細については、Global Architecture のドキュメントページをご覧ください。

プレイモードでは、球体が Inverse3 カーソルと VerseGrip の向きに同期して移動・回転します。

inverse3-inspector

handle-inspector

力制御モード​

ForceControl.cs C# スクリプトを作成し、Haptic Origin 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));
}
}

force-control

スクリプトの説明​

  • forceX, Y, Z: スライダーで調整可能な力ベクトルの成分です。力は、CursorSetForce メソッドに渡される前に、安全な範囲内に収まるように制限されます。 または、標準の Vector3 フィールドを使用することもできます。

  • Awake(): 現在の GameObject またはその子から Inverse3 コンポーネントを取得します。

  • OnEnable(): Awake メソッドの呼び出し後、およびスクリプトが有効になるたびに、ハプティック更新からの OnDeviceStateChanged コールバックを別スレッドで登録します。

  • OnDisable(): スクリプトが無効になるか、アプリケーションが停止したときに、コールバックの登録を解除し、力をリセットします。

  • OnDeviceStateChanged: インスペクターウィンドウから force ベクトルを取得し、CursorSetForce メソッドを使って Inverse3 に転送します。

    重要: このコールバックは、1kHz から 8kHz の高頻度でハプティックスレッドから呼び出されます。 このコールバック内のすべてのコードを、十分に最適化しておくことが非常に重要です。

使い方​

プレイモードに入る前に、カーソルを保持していることを確認してください。デバイスは緑色のランプで示される Force Control 状態に移行します。 その後、スライダーを使って力の出力を調整し、デバイスのワークスペース内を操作できます。

警告

力を調整すると Inverse3 が動きます。ワークスペースに障害物がないことを確認し、必ずカーソルを保持してください。 安全に関するガイドラインについては、安全な使用に関する記事を参照してください。

cursor-set-force

位置制御モード​

同様に、デバイスの位置を制御するための PositionControl.cs C# スクリプトを作成し、Haptic Origin 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 スクリプト、またはデバイスを制御するその他のスクリプトが無効になっていることを確認してください。

位置制御

前の例と同様に:

  • 再生モード中にスライダーを使って position を調整するには、positionX, Y, and Z を利用します。

    選択した Range(-0.1, 0.1) は、おおよそ到達可能な最大位置に相当します。

  • Awake メソッドは Inverse3 コンポーネントを取得します。
  • OnEnable メソッドは、Awake メソッドの呼び出し後、およびスクリプトが有効になるたびに、触覚更新による OnDeviceStateChanged コールバックを別スレッドで登録します。
  • OnDisable メソッドは、スクリプトが無効になるかアプリケーションが停止したときに、コールバックの登録を解除し、力をリセットします。

ただし、次の違いがあります:

  • OnDeviceStateChanged コールバックは、各触覚フレームごとに、 インスペクターウィンドウから位置ベクトルを取得し、それを WorkspaceCenterLocalPosition に加算して、 CursorSetLocalPosition メソッドを使用して Inverse3 に送信します。

再生モードに入る前に、カーソルを中心位置の近くで保持してください。 デバイスは 位置制御 状態(青いライトで示されます)に移行するはずです。 その後、スライダーで位置出力を調整して、デバイスのワークスペースを確認できます。

警告

位置を調整すると Inverse3 が動きます。ワークスペースに貴重品がないことを確認し、必ずカーソルを保持してください。 詳細は、安全な使用に関する記事 を参照してください。

カーソル位置の設定