資料室 ページ指定表示
資料室 ページ指定表示
 ■Report Liblary..._____________
| HOME | | 最新3ページ | | 最新100リスト | | 10回毎一覧 | | ANDOR  | | 辞書 |

Close

Only
000038.パワーグローブのリメイクっぽい「P5」を使ってみる 
  (2003年08月27日(水) 03:00)

Open
●パワーグローブのリメイクか?
AKIBA Hotlineの2003/07/05の記事を見てパワーグローブのリメイクかと思った。
まあ、当然違う。Essential Realityという海外の会社の製品である。
デバイスマニアは即ゲットと思い、当日のうちにOVERTOPに買いに行ったが既に売り切れ。
PC Watchの2003/07/10の記事ではその使用感がレポートされている。
実物は以下の通り。

右手専用で、各指に角度感知用のゴム質の板が伸びている。
甲には4つボタンがあり、一番手前は電源ボタンになっているので、実質3つということに。
写真左側にある紺に黒の顔のタワーはセンサー。
USBでセンサーとPCを繋ぎ、又、センサーとグローブの間にも1メートル程のコードがある。
実際にはセンサーからグローブが50センチくらい離れると検知してくれないので、部屋を暗くするとかの対策が必要。

●実際に買ってみて
数が少ないためか、予想以上に人気があるのか、ようやく買えたのは2003/08/16のことである。
カテゴリメーカー品名/型番税込値段
グローブ型デバイスEssential RealityP5 -the Power of Five-\11,340OVERTOP
  合計\11,340 
HPからドライバをDLしてきてインスト。 Air Lockなるトレーニングソフトが一緒にインストされるのでそれで練習。 空間上にゆっくり跳ね回る10個くらいのボールを掴むだけのゲームだがかなり難しい。ゲームがじゃなくて操作が。 付属のTigerHuntなるゲームをインストしてやってみようとしたが、タイトルからメニューを選んだ直後に確定ハングアップ。 意味わからん。他にも2種類のゲームがありましたが、やる気が起こらずまだ試していない。 ウィンドウオペレーションもやってみたが、テーブルに置いて静止した状態でもカーソルがブレる。 部屋の明かりを消したらいくらかマシになったが、そんな状況はまさに暗黒太極拳。 そんなものを動かして人差し指だけ曲げてクリックしなければならないので、相当な熟練が必要と思われる。 というわけで、常用利用は無理である。 そんなことより、せっかくSDKも公開されていることだし、これを使って人々の役に立たないことは出来ないだろうかと思った。 別に役立つツールを作っても良いのだが、かなり状況や環境を選ぶのため、正直言って、何か作っても使人は居ないだろう。 と、上記のことは覚悟の上、ネタのために購入したものなので無問題。 ●SDKを使ってみよう(1.準備) 今メインで使っているPC(資料室記事参照)は、ドライバ等の関係上DirectX9では正常動作しないので、 DirectX8.1環境で作成を行った。 DirectXをまじめに書くとかなり手間なので、DirectX8.1用ライブラリ「Luna」をc:\LunaSDK\に導入した。 スキンアニメーションを使うので、c03のサンプルもDLした。 (このページにはDirectX等のかなり役立つTipsがあるのでいつも利用させて頂いてます。) で、P5のSDKもDLしてc:\p5sdkに導入した。 なにやら色々インストされるが、開発に使うのは「C:\P5SDK\P5api\*.*」と、「C:\P5SDK\P5Utils\*.*」だけである。 ●SDKを使ってみよう(2.プロジェクト)ソースと実行ファイル一式 (1.準備)でDLしといたc03を解凍し、*.dswをダブルクリックしてVC++を起動してみる。 今回はLunaに関しての説明は特に行わず、使ったことがあるということを前提とする。 (といっても、見ての通りなんで、ほとんど問題ないとは思うが。) で、とりあえず「メニュー>プロジェクト>設定」を行う必要がある。 ・C/C++タブ カテゴリ”一般”の最適化は「実行速度」で。 カテゴリ”プリプロセッサ”のインクルードファイルのパスを 「c:/LunaSDK,c:/p5sdk/p5api,c:/p5sdk/p5utils」に設定。 ・リンクタブ カテゴリ”一般”のオブジェクト/ライブラリモジュールに 「C:\P5SDK\P5api\p5dll.lib」を追加し、デフォルトライブラリをすべて無視のチェックを外す。 カテゴリ”インプット”の追加ライブラリのパスに「c:/LunaSDK」を設定。 カテゴリ”カスタマイズ”のインクリメンタルリンクを行うにチェックを入れる。 下記、今回のサンプルソース。c03の初期状態から変更した部分は緑文字にしてある。
ソースコード追記コメント
//=============================================================================
// INCLUDE
//=============================================================================
#include "Luna.h"
#include "p5dll.h"
#include "P5Motion.h"
#include "P5Bend.h"
P5用のヘッダーをincludeする。
//=============================================================================
// DEFINE
//=============================================================================
//#define SCREEN_WIDTH    512
//#define SCREEN_HEIGHT    384
#define SCREEN_WIDTH    800
#define SCREEN_HEIGHT    600
#define FRAME_RATE        60
見やすいように解像度を上げてみた。
たかが実験用なので重くないし。
お好みに合わせてご自由にどうぞ。
//=============================================================================
// PROTOTYPE
//=============================================================================
static void KeyDownProc( unsigned long wp, unsigned long lp );

//=============================================================================
//
//        ☆アプリケーション初期設定
//
//=============================================================================
void Luna::InitSystem( void ) {
    //---------------------------------------------
    // タイトル名設定
    Luna::SetTitle( "pp5" );

    //---------------------------------------------
    // 画面サイズ設定
    Luna::SetScreenData( SCREEN_WIDTH, SCREEN_HEIGHT );

    //---------------------------------------------
    // FPS設定
    Luna::SetFrameRate( FRAME_RATE );

    //---------------------------------------------
    // 画面モード設定
    //   ウィンドウモードの時はTRUE
    Luna::SetWindowMode( FALSE );

    //---------------------------------------------
    // マウス可視設定
    //   マウスを表示させる時はTRUE
    Luna::SetShowMouse( FALSE );

    //---------------------------------------------
    // FPS可視設定
    //   FPSを表示させる時はTRUE
    Luna::SetShowFPS( TRUE );

    //---------------------------------------------
    // メッセージ処理用関数設定
    Luna::SetMessageCallBack( WM_KEYDOWN, KeyDownProc );

    //---------------------------------------------
    // 使用するAPIを設定
    Luna::SetUseAPI( USE_DIRECT3D | USE_DIRECTINPUT );

    //---------------------------------------------
    // デバッグ用ログファイル名設定
    SetLogFileName( "debug.log" );
}

//=============================================================================
//
//        ☆メインループ
//
//=============================================================================
void Luna::Main( long ArgNum, char *pArgStr[] ) {
    #define S_BUF 30
    float buf_yaw[S_BUF+1], buf_roll[S_BUF+1], buf_pitch[S_BUF+1], buf_x[S_BUF+1], buf_y[S_BUF+1], buf_z[S_BUF+1];
    int buf_no = 0, lp;
    bool p5m_flag;        //P5のマウス状態保存
    long LightAngle[3] = { 0, 0, 0 };
    float fAnimeTime = 0.0f;
    RECT region;
    CP5DLL P5;

    //--------------------------------------------------------
    // 初期化処理
    //--------------------------------------------------------
    P5.P5_Init();
    P5Bend_Init( &P5, 0 );
    P5Motion_Init( &P5, 0 );
    P5Motion_InvertMouse( P5MOTION_INVERTAXIS, P5MOTION_NORMALAXIS, P5MOTION_NORMALAXIS );
    GetClipCursor( ®ion );
    region.left = region.top = 0;
    region.right = SCREEN_WIDTH;
    region.bottom = SCREEN_HEIGHT;
    P5Motion_SetClipRegion( region.left, region.right, region.top, region.bottom, 0, 1000 );
    p5m_flag = P5.P5_GetMouseState( 0 );
    P5.P5_SetMouseState( 0, false );
カーソルがブレるため、30回分の平均値を取ることにした。

CP5DLLを定義してP5を利用可能状態にする。
初期化はサンプルソースから左記述のような感じで良いと思われる。
P5.P5_Init();、P5Motion_Init( &P5, 0 );でまさに初期化。
P5Motion_InvertMouseは、回転や位置をリバースしたりする時に使う。
GetClipCursor( ®ion );で解像度を取るが、使ってない。(ぉ
P5Motion_SetClipRegionで解像度を設定する。
P5.P5_GetMouseState( 0 );でID0のP5デバイスのマウスON/OFFを取得し、
一度、P5.P5_SetMouseState( 0, false );でマウスモードをOFFにする。

    //------------------------------------------------
    // Zバッファ作成
    //------------------------------------------------
    LSURFACE pZBuffer = LunaSurface::CreateZBuffer( SCREEN_WIDTH, SCREEN_HEIGHT );
    // デバイスにZバッファを設定
    pZBuffer->SetDepthBuffer();

    //------------------------------------------------
    // カメラ作成
    //------------------------------------------------
    LCAMERA pCamera = LunaCamera::Create();
    pCamera->SetProjection( 30.0f, 1.0f, 10000.0f );    // プロジェクション
    pCamera->InitTransform();                            // 変換初期化
    pCamera->Translation( 0, 0, -1200 );                // 移動
    pCamera->DynamicTransform();                        // 変換更新
    pCamera->SetDevice();                                // デバイスに設定
    //------------------------------------------------
    // モデルデータ読み込み
    //------------------------------------------------
    LMODEL m[6];
    m[0] = LunaModel::LoadFileX( "0.x" );
    m[1] = LunaModel::LoadFileX( "1.x" );
    m[2] = LunaModel::LoadFileX( "2.x" );
    m[3] = LunaModel::LoadFileX( "3.x" );
    m[4] = LunaModel::LoadFileX( "4.x" );
    m[5] = LunaModel::LoadFileX( "5.x" );
0が親指で、順になっていて4が小指、5が手のひらのモデルデータ。
フリー素材を扱っているmetanoiaから拝借し、
metasequoiaで指を切断して、LightWaveで骨入れてモーション入れて、
xファイルで書き出しました。
metasequoiaからのxファイルエクスポートのモデルは
なぜかLunaでは表示されず。
    //------------------------------------------------
    // テクスチャ描画に関する設定
    //------------------------------------------------
    Luna3D::SetTextureState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );    // 色の引数1(テクスチャの色
    Luna3D::SetTextureState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT );    // 色の引数2(設定した頂点色
    Luna3D::SetTextureState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );    // 色の算出方法(引数1×引数2

    Luna3D::SetTextureState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );    // アルファの引数1(テクスチャの色
    Luna3D::SetTextureState( 0, D3DTSS_ALPHAARG2, D3DTA_CURRENT );    // アルファの引数2(設定した頂点色
    Luna3D::SetTextureState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );    // アルファの算出方法(引数1×引数2

    //------------------------------------------------
    // レンダリングステートの設定
    //------------------------------------------------
    Luna3D::SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );        // 左回りにカリング
    Luna3D::SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );    // 半透明処理OFF
    Luna3D::SetRenderState( D3DRS_ZENABLE, TRUE );                // ZバッファON
    Luna3D::SetRenderState( D3DRS_ZWRITEENABLE, TRUE );            // Zバッファ書き込みON
    Luna3D::SetShadeMode( SHADE_SMOOTH );                        // スムースシェーディング

    //--------------------------------------------------------
    // ゲーム用ループ
    //--------------------------------------------------------
    while ( WaitForMsgLoop() ) {
        //------------------------------------------------
        // 画面クリア
        //------------------------------------------------
        //Luna3D::Clear( D3DCOLOR_XRGB(192,128,128) );
        Luna3D::Clear( D3DCOLOR_XRGB(255,255,255) );
        // Zバッファクリア
        Luna3D::ClearZ();
        // P5初期化
        P5Bend_Process();
        P5Motion_Process();
メインのループの中で、P5Bend_Process();と、
P5Motion_Process();を実行してセンサースキャンする。
ちなみにやんなくても、
デフォルトで秒間何十回かスキャンしてるようで通常通り使える。
        //------------------------------------------------
        // 3D描画開始
        //------------------------------------------------
        if ( Luna3D::BeginScene() ) {
            LVECTOR vLight;
            //------------------------------------------------
            // ライト設定
            //------------------------------------------------
            LunaLight::SetAmbient( 0.2f );
            LightAngle[0] += 256;
            LightAngle[1] += 384;
            LightAngle[2] += 512;
            // ライト1
            LVECTOR vLight1( COSF(LightAngle[0]), 0, SINF(LightAngle[0]) );
            LunaLight::SetDiffuse( 0, 1.0f, 1.0f, 0.9f );
            LunaLight::SetDirection( 0, &vLight1 );
            LunaLight::SetActive( 0, TRUE );
            // ライト2
            LVECTOR vLight2( SINF(LightAngle[1]), COSF(LightAngle[1]), 0 );
            LunaLight::SetDiffuse( 1, 1.0f, 0.9f, 0.9f );
            LunaLight::SetDirection( 1, &vLight2 );
            LunaLight::SetActive( 1, TRUE );
            // ライト3
            LVECTOR vLight3( 0, SINF(LightAngle[1]), COSF(LightAngle[1]) );
            LunaLight::SetDiffuse( 2, 1.0f, 1.0f, 1.0f );
            LunaLight::SetDirection( 2, &vLight3 );
            LunaLight::SetActive( 2, TRUE );
            //------------------------------------------------
            // モデルデータのトランスフォーム
            //------------------------------------------------
            fAnimeTime ++;
            if ( fAnimeTime > 60 ) fAnimeTime = 0;
            buf_x[buf_no] = P5.m_P5Devices[0].m_fx;
            buf_y[buf_no] = P5.m_P5Devices[0].m_fy;
            buf_z[buf_no] = P5.m_P5Devices[0].m_fz;
            buf_yaw[buf_no] = P5.m_P5Devices[0].m_fyaw;
            buf_roll[buf_no] = P5.m_P5Devices[0].m_froll;
            buf_pitch[buf_no] = P5.m_P5Devices[0].m_fpitch;
            buf_no = (buf_no+1)%S_BUF;
            buf_x[0] = buf_y[0] = buf_z[0] = buf_yaw[0] = buf_roll[0] = buf_pitch[0] = 0;
            for( lp = 1; lp <= S_BUF; lp ++ ) {
                buf_yaw[0] += buf_yaw[lp];
                buf_roll[0] += buf_roll[lp];
                buf_pitch[0] += buf_pitch[lp];
                buf_x[0] += buf_x[lp];
                buf_y[0] += buf_y[lp];
                buf_z[0] += buf_z[lp];
            }
            for( lp = 0; lp < 6; lp ++ ) {
                m[lp]->InitTransform();                    // 変換初期化
                m[lp]->Scaling( 3, 3, 3 );
                m[lp]->RotationY( (long)buf_yaw[0]*192/S_BUF );
                m[lp]->RotationZ( ANGLE(10)-(long)buf_roll[0]*192/S_BUF );
                m[lp]->Pitching( ANGLE(10)-(long)buf_pitch[0]*192/S_BUF );
                m[lp]->Translation( buf_roll[0]/S_BUF, buf_roll[0]/S_BUF, 0 );        //回転時の微調整
                m[lp]->Translation( buf_x[0]*1.2/S_BUF, buf_y[0]*1.2/S_BUF, buf_z[0]*1.2/S_BUF );
                if( lp < 5 ) {
                    m[lp]->DynamicTransform( (float)P5.m_P5Devices[0].m_byBendSensor_Data[lp]*4/5 );        // 変換更新
                } else {
                    m[lp]->DynamicTransform( fAnimeTime );
                }
                m[lp]->Rendering();        // 描画
            }
適当コーディングでスマンです。
P5から位置、回転、指の情報を取得し、
モデルをそれにあわせて移動回転し表示しています。
S_BUFの前の倍率は、適度な動きになるよう調整した結果です。
P5の変数とかは後述します。
            //------------------------------------------------
            // 3D描画終了
            //------------------------------------------------
            Luna3D::EndScene();
        }

        //------------------------------------------------
        // 画面更新
        //------------------------------------------------
        Luna3D::Refresh();
    }
    //--------------------------------------------------------
    // 終了処理
    //--------------------------------------------------------
    P5.P5_SetMouseState( 0, p5m_flag );
    P5.P5_Close();
    for( lp = 0; lp < 6; lp ++ ) {
        m[lp]->Release();
    }
P5の終了処理。
直後、P5LIB.DLLでエラーが出るんですが、謎。
    pCamera->Release();
    pZBuffer->Release();
}


//=============================================================================
//
//        ☆キー押下メッセージ用
//
//=============================================================================
void KeyDownProc( unsigned long wp, unsigned long lp ) {
    switch ( wp ) {
    //------------------------------------------------ ESCキーで終了
    case VK_ESCAPE:
        Luna::Exit();
        break;

    //------------------------------------------------ F1キーで画面モード切替
    case VK_F1:
        Luna::ChangeScreenMode();
        break;
    }
}
Luna系の関数に関してはLunaのヘルプを参考にして欲しい。 P5については付属マニュアルを適当に訳したものを作ってみたので、そちら参照。 動作確認が出来なかった関数や、不明点もあるが、わかり次第追記したいと思う。 (というか、情報あれば下さい。) ●どんな感じで動くのよ 先述べしたように粗悪品であるため、いまいちな動きしか出来ないですね。 Finecam S5で動かしてる所を撮ってみた。avi形式をzipで圧縮 30秒 約3.4MB。 デジカメでムービー撮るとこんなものですかね。 TMpegEncで音を外そうと思ったが、サポートされてないとかで無理でした。 撮り損ねたけど、前後にもちゃんと動きます。仕様上は。 下はディスプレイに向かってピースしてみた時のキャプチャ画像。 指の動き具合がちょっとアレなのは気にしない方向で。 さて、ここからいろいろ遊んで見ますが、それはまた次回。 何か有効な使用手段無いものでしょうか。 googleとかで検索しても、この製品関連は何にも無いですね。 操作感が悪いので本当にネタ止まりになりそう。 性能UP版が発売されたりしたらガッカリ。 ●その他の気になるデバイス さて、ネタとして買った今回のデバイスだが、ちょっと似ているのもあってどちらにしようか迷った。 Gyration Ultra Cordless Optical Mouse(以下GUCOMouse)なるものは、マウスカーソルをレーザーポインタのように操作できる。 User's Sideで実売価格\14,800で、型落ち版(操作範囲が狭い)は\13,800。 どうせ感度はよろしくないのだろうと思ったらそんなこともなくグリグリ動かせる。 電池内臓でちと重い気がするが、まあ仕方ないだろう。 知人から2〜3年ほど前にジャイロを使った空中マウスの構想を聞いたことがある。 当時のジャイロの精度とコストでは一般向けマウスは難しいとのことだった。 で、GUCOMouseはまさに上記の方法を使っている。 気が向けば買おうと思う。当然上位を。 ホイールについて6〜7年前くらいから気になっていたのだが、ホイールの変わりにボールをつければ上下左右に動かせる。 6年くらい前まだ光学式が珍しかった頃、縦と横のホイール2つ付いた物や、十字キーが付いた物、ポイントデバイスがついた物が発売した。 まあそれでも代用はできるが、ポイントデバイスのほうはIBM製だったために操作感がいまいちだった。 最近になって秋葉原巡回中にようやく発見したのがMFB2US-BL あまり需要が無いようで売っているのを見かけるのは稀。オンラインではmurauchi.comとかで見つけた。 6年前に欲しかったのはコレ。で、使ってみたが最悪。さすが安物。 光学マウスは主に解像度とスキャン回数で評価するものだと思う。 解像度は数値が高いとちょっとした動きでも感知してくれ、より細かい動きが出来る。 スキャン回数はどれくらい動いたかを定時間内に測定する回数であり、高いほどなめらかに動かせ、すばやいオペレーションにも対応できる。 どれくらい必要かは下記の通りだと思う。ちょっと不明部分もあるので参考までにということで。
 粗悪品安物普通良品
解像度200dpi400dpi600dpi800dpi
スキャン回数1500/sec2000/sec4000/sec6000/sec
MFB2US-BLでは解像度が400dpi、スキャン回数は表記されていないが、触った感じ1000〜2000程度。 スキャン2000回で安物と判断しているが、正直使い物にならない。(過去資料室記事参照) 高くてもいいので良品を作って欲しかった。 で、今更MSもなんか開発したようで。 現在、安心して利用出来るマウスはMS製しかないので、ちょっとは期待している。 関連リンク: ・ソースと実行ファイル一式AKIBA Hotlineの2003/07/05の記事PC Watchの2003/07/10の記事GAME Watchの2002/01/10の記事P5の日本語マニュアル ・Luna開発HP:TWINTAIL LOVORS. ・P5のメーカー:Essential Reality ・P5のSDK:Essential Reality: Developers ・フリー素材:metanoia ●2005/04/11追記 Essential Realityって無くなっちゃったようですね。 SDKやらマニュアルやらもダウンロード出来なくなってたので、ここにUPしときます。 内容確かめてないんで、なんか違うものだったら教えてください(ぉ ・マニュアル(PDF)P5_Manual.pdf ・ドライバ2.0P5driver2_0.zip ・ドライバi386p5driver-i386-0.10.tgz ・ドライバi386ソースp5driver-i386-0.10-src.tgz ・インストーラP5SETUP.ZIP ・ツール各種P5Wizard.zip ・SDKSDKsetup.zip

| HOME | | 最新3ページ | | 最新100リスト | | 10回毎一覧 |
■0x112 ■0x227 ■0x55F ■0xDDF ■0xF36 ■0xF8B ■0xEBC ■0x114 ■0x33F ■0x77F ■0xAAF ■0xEEF
____________Report Library Ver2.00β 2003/08/27_bomber@xps.jp_http://bomber.xps.jp/_