マウスによる無限コントローラ

先週の学生クエストで、マウスをコントローラとして使うためのテクニックです。マウスを使って、人の動作や物の動きを検出しようとする時に、問題はマウス・ポインタがスクリーンの端に達すると、それ以上はマウス・ポインタが動かないことですね。物理的な動きが続いても、ソフトウェア的な動きが止まってしまい、矛盾が生じるわけです。

この解決方法は、意外に簡単なのですけど、実は昔懐かしのDSPマガジン1035号に書いています。以下、引用。

■マウスはコントローラ

これまたタイトルを見て、なんじゃ?と思われるかもしれませんが、マウスをコントローラとして使う時のお役立ち情報です。インタラクティブなインスタレーションなどでは、鑑賞者の操作や動作を何らかの形で取り込む必要がありますよね。この時に、もっとも簡単な手段がマウスです。もろにマスウでなくても、トラックパッドとかトラックボールとか、マウスと同じように動作するデバイスもたくさんあります。

多くの場合は、フルスクリーン表示したいので、「;max hidemenubar」というメッセージ・ボックスにbangを送り、jit.windowに「fullscreen 1」を送ってウィンドウを全画面に広げます。さらにマウス・ポインタを消すために「;jitter cursor 0」メッセージ・ボックスにbangを送ります。Mac OS XならDockも「自動的に隠す」にしておきます。そして、MouseStateオブジェクトなどでマウス・ポインタの位置やマウス・ボタンの状態を読み取れば、鑑賞者の操作状態が得られます。

と、ここまでは常識(?)ですね。しかし、これで困るのは、消えてるとは言え、マウス・ポインタがスクリーンの端に達すると、それ以上移動しないので、無限に動作できないことが挙げられます。また、Mac OS Xなら、マウス・ポインタがスクリーンの上端や下端に来ると、自動的にメニュー・バーやDockが現れ、マウス・ポインタも現れてしまいます。これでは、せっかくのフルスクリーン表示がオジャンです。

このような問題を解決するために考えたのは、以前にも紹介したMaxへのpupdateメッセージで、強制的にマウス・ポインタの位置を戻す方法です。まず、screensizeオブジェクトなどでスクリーンの中心座標を求め、そこにマウス・ポインタを移動します。次に、MouseStateオブジェクトでマウス・ポインタの位置を求め、スクリーンの中心座標からの差を求めます。この差がユーザがマウスを動かした相対変化値になります。そして、すかさずマウス・ポインタをスクリーンの中心に戻し、以下、これを繰り返します。

このようにすれば、マウス・ポインタは常にスクリーンの中心に戻りますから、メニュー・バーやDockに影響を与えることがありません。マウスが移動した相対変化値をそのまま用いても構いませんし、相対変化値を加算し続けることで、無限に値を大きく、あるいは小さくできる(と言っても数値の精度範囲ですが)絶対変化値として用いることもできます。

簡単なサンプル・プログラムも作りましたので、以下のリンクからダウンロードして試してみてください。このプログラムでは動作状況が分かるように、マウス・ポインタを消去していません。escキーを押すことで動作開始、もう一度escキーを押せば動作終了です。

実際のパッチは以下のようになります。ダウンロードはmousecontrollerpat.zip

mousecontroller.gif

ちなみに、マウスでコントローラ云々ってのはIAMASでは普通に話が通じるんですが、世間では一般的ではないかもしれませんね。それは何じゃい?と思われた方は、もうすぐIAMASオープンハウスがあるので、遊びに来てください。このマウス・コントローラを使った作品もあるハズです。

【追記】このパッチを使う場合に、システム環境設定の「マウス」で、軌跡の速さをもっとも遅くすると良いかも。このようにすれば、マウスの動かし方によって移動量が変化せず、リニアな移動になる(たぶん)からね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA