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

主要概念

記事

Interhaptics Engine とプロバイダーの初期化

Interhaptics Engine を使用するには、初期化が必要です。初期化には、以下の Engine API を使用してください。

/// <summary>
/// Interhaptics Engine の各種コンポーネントとモジュールを初期化します。
/// - Haptic Material Manager: ハプティック効果のロードと保存を担当するモジュール
/// - Human Avatar Manager: デバイス、ヒューマンアバター、体験の間のマッピングを担当するモジュール
/// - Haptic Event Manager: ハプティックソースの制御を担当するモジュール
/// </summary>
/// <returns>モジュールが正しく初期化されなかった場合でも常に true を返します。</returns>
DLLExport bool Init();

Interhaptics Engine の使用を適切に終了するには、アプリケーションを終了する前に必ず初期化解除を行う必要があります。初期化解除には、以下の Engine API を使用します。

/// <summary>
/// Interhaptics Engine の各種コンポーネントとモジュールをクリーンアップします。
/// アプリケーション終了前に呼び出される必要があります。
/// </summary>
DLLExport void Quit();

Interhaptics Engine の初期化後、デバイスプロバイダーも初期化する必要があります。すべてのプロバイダー実装は、以下の API を公開する一貫したインターフェースに従います。

extern "C"
{
DLLExport bool ProviderInit();
DLLExport bool ProviderIsPresent();
DLLExport bool ProviderClean();
DLLExport void ProviderRenderHaptics();
}

ProviderInit は、特定のデバイスの COM の初期化プロセス、レンダリング用のハプティック設定、および Interhaptics Engine へのサブスクリプションを処理します。初期化プロセスが失敗した場合は false を返します。

ProviderClean は、必要に応じてデバイスの COM の初期化解除を行い、プロバイダーを Interhaptics Engine からアンサブスクライブする役割を担います。初期化解除プロセスが失敗した場合は false を返します。

アプリケーション内のハプティックシステムが適切に機能するように、Interhaptics Engine とデバイスプロバイダーが正しく初期化および初期化解除されるようにしてください。

.haps ファイルのロード

Interhaptics Engine がハプティック効果をレンダリングする前に、対応する .haps ファイルをエンジンにロードする必要があります。これには、ゲームエンジンが実行時に .haps ファイルの内容を開いて読み取る機能が必要です。.haps ファイルは、サウンドエフェクトやグラフィックアセットと同様に、ゲームアセットとして扱うことが推奨されます。

.haps ファイルからハプティック効果をロードするには、以下の Engine API 呼び出しを使用します。

/// <summary>
/// .haps ファイルの内容を Interhaptics Engine に追加し、後で使用できるようにします。
/// </summary>
/// <param name="_content">ロードする .haps ファイルの JSON 内容。Interhaptics の .haps 形式に従う必要があります。</param>
/// <returns>他のエンジン呼び出しで使用するハプティック効果の ID。ロードに失敗した場合は -1。</returns>
DLLExport int AddHM(const char* _content);

ハプティックレンダリングとプロバイダーループ

Interhaptics Engine のコアロジックには、ハプティックレンダリングとデバイスプロバイダーループという 2 つの主要な要素が含まれます。

ハプティックレンダリング

ハプティックレンダリングとは、ゲームイベントに基づいてレンダリングループの各イテレーション中にハプティックバッファを計算することを指します。ハプティックバッファのレンダリングをトリガーするには、以下の Engine API 呼び出しを使用します。

/// <summary>
/// アプリケーションのメインループ内で呼び出され、特定の時刻にすべてのハプティックバッファの
/// レンダリングをトリガーします。Interhaptics Engine は現在の時刻を最後の既知の値と比較し、
/// フレームドロップをカバーするのに十分な大きさのバッファを構築します。
/// メインスレッドまたは並列ループから呼び出すことができます。
/// デバイス更新イベントをトリガーする前に少なくとも 1 回呼び出される必要があります。
/// </summary>
/// <param name="_curTime">秒単位の現在の時刻。</param>
/// <returns></returns>
DLLExport void ComputeAllEvents(double _curTime);

レンダリングループの毎回のイテレーションで、メインスレッドまたは並列スレッドから ComputeAllEvents() を呼び出すことが重要です。これにより、サブスクライブしているプロバイダーに基づいてハプティックバッファがリアルタイムで生成されることが保証されます。デバイスがサブスクライブしていない場合、バッファは生成されません。デバイスのサブスクリプションについては、Interhaptics Engine とプロバイダーの初期化のセクションを参照してください。

プロバイダーループ

プロバイダーループは、再生のためにハプティックバッファをデバイス上にレンダリングする役割を担います。すべてのプロバイダー実装は、以下の API を公開する共通のインターフェースに従います。

extern "C"
{
DLLExport bool ProviderInit();
DLLExport bool ProviderIsPresent();
DLLExport bool ProviderClean();
DLLExport void ProviderRenderHaptics();
}

ProviderRenderHaptics() API は、必要なハプティックバッファを取得し、必要に応じてトランスコードし、関連するデバイス上で再生することにより、プロバイダーのレンダリングプロセスをトリガーします。この API は、すべての対象デバイスに対して呼び出される必要があります。

同期されたハプティックレンダリングのためには、ProviderRenderHaptics() を呼び出す前に Interhaptics Engine の ComputeAllEvents() を呼び出すことが必須です。通常、両方の API は同じループ内で実装され、ProviderRenderHaptics() の呼び出しの前に ComputeAllEvents() が呼び出されます。

さらに、ProviderIsPresent() を使用することで、ハプティック再生をトリガーする前にデバイスの可用性を確認できます。このオプションのステップにより、パフォーマンスの向上に役立ちます。

ハプティックソースとターゲット

ハプティックソース は、Interhaptics Engine をゲームメカニクスにリンクするために不可欠です。オーディオソースと同様に、ハプティックソースにはハプティック効果への参照、ソース範囲内のターゲットのリスト、およびボリュームやオフセットなどのパラメータが含まれます。

ハプティックソースは、ロード済みのハプティック効果にリンクされる必要があります。.haps ファイルのロードについては、.haps ファイルのロードのセクションを参照してください。

ソースを停止すると非アクティブ状態に遷移し、ソースを再起動する際にパラメータとターゲットを再定義する必要はありません。ソースを完全に削除するには、関連する ClearEvent API を使用してください。

ターゲット は、ハプティックイベントの位置への仮想参照を表します。ハプティックソース は、特定のデバイスをターゲットにする代わりに、ヒューマンアバター上の領域(単一のボディパーツまたはボディパーツのグループ)をターゲットにします。このシステムは、ハプティック体験とハプティックデバイスのクロスプラットフォームエコシステムの間のマッピング層として機能します。これにより、実装されたハプティック体験を再実装することなく、別のハプティックシステムに移植できることが保証されます。

プロバイダーは、サポートする ターゲット をゲームエンジンに宣言します。ハプティックソース が、いずれのプロバイダーからも参照されていない ターゲット で再生されている場合、出力は要件に基づいて無視またはリマップできます。

ハプティックソース の制御および ターゲット の構築の詳細については、ドキュメントのエンジン制御セクションを参照してください。