yslog

ゆるめに技術ブログかきます。Maya_Python

PySideでマウスジェスチャー入力してみる

サンプル置いときますね。

SIサイドバーでマウスジェスチャー入力を自前実装したときのサンプルです。

こまかいことは置いといてコードがこちら

マウスジェスチャーでUIにインプットするサンプル

 

実行するとこんな感じでUIの数値をマウスジェスチャーで変更できるようになります。

UIをクリック+ドラッグすると数値が変化、円を描くように数値加算、減算することができます。
マウスの進行方向を一定角度以上に変化させると+-の符号が反転します。

Shift+ドラッグで10、Ctrl+ドラッグで100単位の入力となっています。

f:id:ys_45:20180116224854g:plain

どういうことやってるの?

UIをクリックするとPySideのイベントフィルターでマウス位置を取得するようになります。

マウスの座標を一定間隔でサンプルポイントとして取得して、そのベクトルから入力値を決定しています。今回の例は単純に足すか引くかの判定に使用しています。

 

例えば以下のように緩やかな角度でマウスが進んでいる場合は+1し続けます。

f:id:ys_45:20180116230119p:plain

この場合の角度の求め方はそれぞれのサンプルポイントの位置から直前のポイントの位置を引き算し、2本のベクトルのなす角度を算出します。

上記の例ではこのくらい。なす角θは狭くなります。

まっすぐ動いている場合は0°です。

f:id:ys_45:20180116230534p:plain

マウスの進行方向を反転したりと、急激な角度変化が起きたときに+-の符号を反転する機能を付けるのにはどんな条件付けが必要でしょうか?

反転するような動きは以下のような感じですね。

f:id:ys_45:20180116230907p:plain

この場合の二つのベクトルが成す角はこんな。

急角度で反転するに従い大きくなります。

完全にUターンした場合は180°ですね。

f:id:ys_45:20180116231039p:plain

サンプルでは反転する閾値を120°に設定しています。

この仕組みで一定角度以上に動きが変化しなければ円を描くようにマウスで数値加算ができるように、Uターンで加算減算反転を実現しています。

ちなみに

2本のベクトルの角度は

・ベクトルを正規化

・ベクトルの内積をとる

内積の値を逆コサイン

で求めることができます。

※サンプルの97行目以降参照

求まる値はラジアンですが、わかりやすいように度数法に変換して使用しています。

 

Mayaの標準モジュールのみで構築する必要があったため正規化や内積を細かく計算していますが、Numpyモジュールがあればもっと簡潔に書けますね。

デスクさん標準でNumpyいれてくらさいまし。