Springhead2にはシーンとの力覚インタラクションのためのエンジンPHHapticEngineが含まれています. ここでは力覚インタラクションのためのアプリケーションの作成方法について説明します. まずは,通常のFrameworkアプリケーションの作成と同様に,ひな形クラスであるFWAppを継承してアプリケーションを 作成します. そして,Init関数内で力覚インタラクションを有効化と,力覚インタラクションシステムのモードを設定します.
// given PHSceneIf* phScene, phScene->GetHapticEngine()->EnableHapticEngine(true); phScene->GetHapticEngine()-> SetHapticEngineMode(PHHapticEngineDesc::MULTI_THREAD);
力覚インタラクションシステムのモードは シングルスレッドアプリケーションのためのSINGLE_THREAD, マルチメディアアプリケーションのためのMULTI_THREAD,局所シミュレーションを利用したLOCAL_DYNAMICSの3種類があります. 標準ではMULTI_THREADが設定されています. MULTI_THREAD,LOCAL_DYNAMICSのモードはマルチスレッドを利用したアプリケーションとなり, 物理シミュレーションを実行する物理スレッド,力覚レンダリングを実行する力覚スレッドが並列に動きます. そのため,それぞれのスレッドをコールバックするためにタイマを設定し直す必要があります.
// given PHSceneIf* phScene, int physicsTimerID, hapticTimerID // 各タイマのID // FWApp::TimerFuncをオーバライドしたコールバック関数 void MyApp::TimerFunc(int id){ if(hapticTimerID == id){ // 力覚スレッドのコールバック phScene->StepHapticLoop(); }else{ // 物理スレッドのコールバック phScene->GetHapticEngine()->StepPhysicsSimulation(); PostRedisplay(); // 描画 } }
次にユーザがオブジェクトとインタラクションするためのポインタ,力覚ポインタPHHapticPointerを作ります. そして,どのインタフェースと結合するのかを設定します. PHHapticPointerはPHSceneから作ることができます. PHHapticPointerはPHSolidを継承したクラスでPHSolidの関数を利用して, 質量,慣性テンソル,形状などを合わせて設定します. 例えばSpidar-G6と接続する場合には,
// given PHSceneIf* phScene, // given HISpidarIf* spg, PHHapticPointerIf* pointer = phScene->CreateHapticPointer(); /* 質量,慣性テンソル,形状などを設定する */ pointer->SetHumanInterface(spg);
とします. さらにPHHapticPointerについて以下の関数を用いて,力覚提示のためのパラメータを設定します.
PHHapticPointerIf |
|
void SetHumanInterface(HIBaseIf* interface) |
|
void SetDefaultPose(Posed pose) |
|
void SetPosScale(double scale) |
|
void SetReflexSpring(float s) |
|
void SetReflexDamper(float s) |
|
void EnableFriction(bool b) |
|
void EnableVibration(bool b) |
|
void SetLocalRange(float s) |
|
void SetHapticRenderMode(PHHapticPointerDesc::HapticRenderMode m ) |
SetHumanInterfaceは力覚ポインタにヒューマンインタフェースを割り当てます. SetDefaultPoseはシーン内での力覚ポインタの初期位置を指定します. SetPosScaleはシーン内での力覚ポインタの可動スケールを指定します. SetReflexSpringは力覚レンダリング(反力計算)のためのバネ係数値を設定します. SetReflexDamperは力覚レンダリングのためのダンパ係数値を設定します. EnableFrictionは力覚ポインタの摩擦力提示を有効化します. EnableVibrationは力覚ポインタの振動提示を有効化します. SetLocalRangeは局所シミュレーションシステムを使用時の局所シミュレーション範囲を指定します. SetHapticRenderModeは力覚レンダリングのモードを指定します.
最後のSetHapticRenderModeにはPENALTY,CONSTRAINTのモードがあります. PENALTYは力覚ポインタが剛体に接触した時の各接触点の侵入量とバネダンパ係数を乗じたものを足しあわせたものが 反力として計算され,インタフェースから出力されます.CONSTRAINTは力覚ポインタが剛体に侵入していない状態(プロキシ)を 求め,力覚ポインタとプロキシの距離の差分にバネダンパ係数を乗じたものを反力として計算します.