したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |
レス数が1スレッドの最大レス数(1000件)を超えています。残念ながら投稿することができません。

おちゃめくらぶ掲示板

1469御茶目菜子:2013/02/05(火) 23:49:02
プチコンでマルチタッチを行おう
プチコンはDSで採用されている感圧式のタッチパネルというハードウェアの制約によって
マルチタッチでは使用できず、1点タッチのみとなっているにょ。
普段はこれで困ることはないけどマルチタッチに対応していれば作れるプログラムの幅が
広がるのも事実にょ。
それならば、「無い物は作る」の原則によって作ってみたにょ。

 マルチタッチ検出ルーチン
 http://ww5.tiki.ne.jp/~ochame/petitcom/multi_touch.htm

では、ハードウェアが対応していないマルチタッチにどうやってソフトウェアで対応が可能に
なるかというとそれは実は非常に簡単なものにょ。
プチコンではタッチした座標はシステム変数TCHX、TCHYに入っているけど2点以上同時にタッチ
した際には2点のうちのどちらかを示すのではなくタッチした座標の中間付近の座標を示す
ためにょ。(これは感圧式タッチパネルならばだいたいそうなっている)
具体的に言えば(80,60)と(180,120)をタッチすれば(130,90)付近の座標を示すということにょ。
次のようなプログラムによって2点タッチした場合にはほぼ中間を示すというのは実際に目視
できるようになるにょ。

PNLTYPE "OFF"
GPAGE 1
@MAIN
GCLS
GCIRCLE TCHX,TCHY,5,2*TCHST
WAIT 1
GOTO @MAIN

ならば、TCHX、TCHYの値さえ分かれば2点の座標が分かるかというとそんなことはないにょ。
(80,60)と(180,120)をタッチすれば(130,90)付近の座標を示すけれど(100,90)と(160,90)を
タッチしても(130,90)付近の座標を示すわけだからね。
これは当然のことであり、結果的にほぼ中間になるわけであって逆算はできないにょ。
しかし、タッチしている2点のうち1点が分かればその座標を元に計算が可能になるにょ。
この場合も1フレームの差もなく完全に2点を同時押ししてしまうとただの中間の座標以外は
分からないけど2点のうちどちらかが1フレームでも先に押していればそれを元に計算が
できるわけにょ。

では、すでに1点タッチしている状態から2点タッチと認識させる方法について考えてみるにょ。
「TCHX、TCHYが変動したら2点タッチ」と見なすと1点タッチして少し手がぶれただけで2点
タッチと認識してしまうにょ。
したがって、ある程度の許容量が必要になるにょ。
普通に押していてほぼありえない1フレーム距離20ドットという基準にしたければ2点間の
距離が20以上になれば2点タッチフラグが立つようにすればいいにょ。(2点間の距離は
X座標の差分の2乗とY座標の差分の2乗を加算したものの平方根を計算すればいい)

20ドット動いた時点で2点タッチを確定してしまうとまた厄介な問題があるにょ。
というのも、上記の2点タッチした場合のTCHX、TCHYの位置を示すサンプルを実行したら
分かるように1点タッチの状態から別の場所をタッチしても瞬時にその中間付近の座標を示す
わけではなく数フレームかかっているにょ。
20ドット動いた瞬間にそこが中間地点の座標と確定してしまうと大きな誤差が生まれてしまう
ことになるためTCHX、TCHYの値の変動がある程度収まってから確定した方がいいにょ。
これは0ドット(完全停止)でもいいけどそうすると精度が高くなる反面で少しでも動いている
間は2点タッチを確定できないため設定で自由に変えられる方が望ましいにょ。
さて、問題は2点タッチが確定される前に離した場合にょ。
その場合はTCHX、TCHYの値の変動が止まった時点で確定されるため1点目とほぼ同じ点を押して
いると認識されてしまうにょ。
そのため一定以上の距離でないとマルチタッチとは認識しないという判定が別途必要になって
くるにょ。

次に2点タッチの状態から1点タッチになったかを判定する処理だけどこれはマルチタッチでも
2点タッチまでに限定することで非常にシンプルになるにょ。
タッチポイント数が変動する場合は上記のように一定以上TCHX、TCHYが変動したかどうかで
判定すればいいのだけど2点タッチまでであれば0点、1点、2点のいずれかになり、TCHSTで
タッチ判定があるならば1点タッチ、そうでなければ0点タッチになるにょ。
つまり、2と1を繰り返すカウンタを用意してそれにタッチ状態にあるか否かを示すフラグ
(1か0)を組み合わせるだけでタッチポイント数が分かり、特に難しいことは何もないにょ。
これが3点タッチに対応させる場合には変動したTCHX、TCHYから計算したタッチ座標を
1点目や2点目と比較してそれと同一ではない(一定以上離れている)かどうかという判定に
よって実現することが可能になるにょ。
このようにすでにタッチしている座標を比較することで理論上は何点でも対応できるけど
後述のような誤差の問題があるため3点以上に対応させるメリットは無いと言えるにょ。


このようにマルチタッチと認識させる処理そのものは比較的簡単なのだけど実はそれよりも
精度を上げる方が遙かに難しいにょ。
今までは2点をタッチしたらTCHX、TCHYはその中間付近の座標を示すと書いたけどこれは正確に
いえば正しくはないにょ。
面積が無限大で均一となっている理想的なタッチパネルならばほぼ正しいのだけどタッチ
パネルのサイズは有限だからね。
端に行けばいくほどタッチした場合には枠からの力という全く別の力が働くし、四隅だと
縦横の枠があるためより複雑な力が働きそれに対するずれがあるにょ。
実際四隅付近をタッチした場合には中間よりも30〜40ドットずれることもあり、その2倍
したものが2点目の座標となるため誤差も倍増されてしまうにょ。
つまり、何も補正しなければ60〜80ドットのずれは覚悟しないといけないということにょ。
それだけずれたら縦横2分割(田型)のボタンをタッチパネル上に表示してもそれを正しく
マルチタッチで認識することはできないにょ。

では、どうやって補正を加えたら良いのかというとこれがなかなか難しいにょ。
分かっていることは「画面中央より隅の方がずれが大きい」「四隅の枠はどれもずれる量が
異なる」「タッチしている2点のX座標(Y座標)が同じ場合はどの座標をタッチしてもTCHX
(TCHY)の値はそれと同じものを示す」ということにょ。
つまり、中央より端に行くごとに大きな補正を与えて、四隅にはすべて異なる基本補正量を
与えて、X座標(Y座標)の差分に応じた補正を与えれば良いといえるにょ。
この辺をすべて加味して作ったのが今回のマルチタッチルーチンにおける補正ルーチンにょ。
四隅に与える異本補正量は私の3DSを元にして数値を入力したため個体差は十分に考えられる
けれど簡単に変更できるようにしてあるためそれは各自の手持ちの本体に合わせて補正を
行えばいいのではないかと思うにょ。

ここまで補正を行っても平均で10ドット程度の誤差が発生しているにょ。
あくまで平均だからタッチする座標によってはさらに大きな誤差があるにょ。
とはいえ、端の方をタッチしたら50ドット以上の誤差は当たり前という補正前のものと
比べると補正効果は極めて大きいことが分かるにょ。
これ以上正確にするためには補正ルーチンの分割数を上げたりとか、補正アルゴリズムを
変更したりする必要があるにょ。

では、今回発表したマルチタッチ検出ルーチンが実用になるかというと微妙にょ。
まずは2点の完全同時押しには対応できないし、(これでも)精度優先であるため検出まで
数フレームの時間を要してしまい激しいタッチ操作のゲームなどには使えないからね。
あと問題は誤差によるものにょ。
例えばこうやまさんの4方向タッチペン素材(タッチパネル上のソフトウェア十字ボタンと
ソフトウェアABXYボタンによる操作が可能になるルーチン)に組み込んで使用してみた
ところ、画面上のボタンの中心を完璧に押すことができたら何とか使えるものの座標に
よってはずれが大きいため隣のボタンとして認識されてしまうことも多々あったにょ。
私が作ったPETIT KEYBOARD mkIIに組み込んで使用してみたところ、白鍵数が5以下ならば
それなりに使えるもののそれよりも多くすると隣の鍵盤として認識してしまうことも少なく
ないためかなり微妙にょ。
やはり、実用レベルにするためにはワーストケースで10ドット以下、平均だと5ドット程度
まで誤差を減らさないと厳しいと言えそうにょ。
最大誤差が10ドットならば白鍵数が8(鍵盤サイズ32ドット)でも確実な当たり判定は12
ドット分確保できるためそれなりに使えるレベルになるからね。

したがって、実用になるかどうかは微妙だけどプチコンで「マルチタッチは無理」ではなく
動作させるだけならばいくらでも可能ということくらいは分かってもらえたのではないかと
思うにょ。
今までプチコンでマルチタッチということで多くの人が考えそのものがあっただろうけど
実際に発表されたものは簡易マルチタッチ検出ルーチンのように左右検出くらいがせいぜい
だったにょ。
http://ww5.tiki.ne.jp/~ochame/petitcom/tips/routine.htm#multi
「2点タッチの場合はTCHX、TCHYの値が2点のほぼ中間付近の座標を示す」とはいえ実際に
それで実用レベルのものを作るのは今回書いたように極めて難しいことが分かり発表には
至らなかったというせいもありそうにょ。
私も実用レベルにまで完成度が高まったら発表しようと思っていたけどこれ以上の大幅な
精度向上は難しいと判断したため今回の発表に至ったにょ。
とはいえ、認識ルーチン(基本部分)と補正ルーチンは分離させているため補正ルーチンの
方は今後良いアイデアがあればどんどん改善していく予定にょ。




掲示板管理者へ連絡 無料レンタル掲示板