last update: 2013/09/03

2006/11/09

DirectXおしまいっ

手をつけてからおわりにするまでずいぶんとはやかった…。

なにをしようとしていたかというと、液晶タブレットがHIDデバイスとして認識されてたんでこれをDirectInputをつかって情報取得しようとしたんですが、マウスとして取得すると単位系が違うので、DirectInputでカーソルの相対移動量を得ようとしてもうまくいきません。

具体的には、マウスはピクセル単位で入ってくるんだけど、タブレットは有効領域を65536x65536の解像度でセンシングするので、単位系がマウスとは違い画面解像度と関係ない値になっちゃうんです。画面上での100pxの移動がマウスだとデバイスから100で入ってくるのに対してタブレットだと横1600とかのうちの100pxだとデバイスから4096で入ってくるわけです。

で、DirectInput的にはシステムのマウスのデータをハンドリングしてるだけなので、どっちのポインティングデバイスを動かしたのかがわからない、と。つまりなんかの相対移動量を検出したところで、マウスデバイスから来た相対移動量なのかタブレットデバイスから来た相対移動量なのかわからないのですよ。

そんなわけで、困ったんですが、dxdiagでみてみたら普通にEnumDevicesででてくるHID入力装置にマウスとキーボードの他にDTZ-2100(液晶タブレット)も出てくるようだったので、じゃあこいつだけをハンドリングすればいいんだな! ってことでやってみた。

GUIDからVendorIDがWACOM(0x056a)なやつがあった場合はそいつのGUIDでCreateDeviceするようにして、デバイスの種類が一般デバイス(Type1; MouseはType2, KeyboardはType3, JoystickはType4)なもんだから自分でEnumObjectsからSetDataFormatしました。すると、EnumObjectsでは軸6と軸7の2軸のみが検出されて、…うーん。データを取得してみても32768が延々と帰ってくるだけなので、どうも取れないようです。

まぁ、デバイスマネージャでみてみてもこのUSBヒューマンインタフェースデバイスからHIDマウスとHIDデバイスの2つがぶら下がってるので、この軸6とか軸7っていうのはHIDデバイスのほうのデータなんだろうなぁ。このタブレットの脇についてるスクロールパッドとかボタンなんだろうけど、このボタンとかをいじってもデータに変化無し。

というわけで、結論から言うと、DirectInputなんぞでタブレットのデータをとろうなんていうのは徒労で、黙ってワコムのデバイスドライバをたたけよっていうところでしょうか。…なんでDirectInputでやろうとおもったんだろうな! そもそもDirectXってデバイスを抽象化するためのフレームワークみたいな側面があるんだから、特定のデバイスを扱うためだったら普通にドライバたたいた方が早いじゃん、オレ。

と、2,3日前に「DirectXやるぞー」とか言いだしたわりにやたら早くおしまい宣言になりましたが、まぁ今回は用途が向かなかったというだけで、この2日間でいいだけDirectInputの文献を読みあさったので将来ジョイスティックとか使いたくなっちゃったときとかはすぐコーディングに取りかかれそうなぐらいはがんばった。

ともあれ、ストップするにしてもゴーするにしても、こういう結論がささっと出せたこと自体が個人的には自分で自分を褒めたいなぁと思います。できるのかどうかさえわからないままだらだらやってるのが一番作業効率がわるいですからねー。そう言った意味で、自分の力量を見極めて仕事を安請け合いしたりしないような技術というのはわりと一番大事な(というか基本的な)技術のような気がする今日この頃です。

いや、なんか研究室の上の人(まぁわたしが修士2年なんで博士のひとなんですが)が東京の某社から個人的にプログラマー業務を請け負っててなんか最近あんまり研究室にいないので、「ああ、がんばってるんだぁ」と思いつつ、学生の身分なんだから研究室に行く時間を削ってまで仕事はしたくないなぁーなんてことを思った今日この頃なのでした。

comments powered by Disqus