問題点が分かったような気がする、明日こそ!
ここ数日、というより、ここ数か月悩み続けてた問題に解決策が見えそうな気が…
問題は、ここ数日書いてるように、指が鍵盤にめり込んでしまう状態をなんとかする事…
こういう、めり込み問題は MMD なんかでも起こる事で、対処する方法は、昨日書いたようにコライダーっていう、衝突判定プログラムを使うやり方があります。
ただ、コライダーはゲームで弾が敵とぶつかったら爆発するとかには向いてるんだけど、ピアノのキーのタッチを調整するってのには向いてない気がするんですよ。
今日は、このめり込み問題をコライダーを使ってみたり、座標系で処理しようとしてみたり、散々やってたんだけど、どれもイマイチ。一応、理論通りに動くんだけど、条件が変わるといきなり指が鍵盤にめり込んじゃったりするわけです。
で「あ、そうか!」と気づいたのは、指をコントロールする座標系にローカル座標を使っていた事が問題なのかも、って事です。
3D やった事ある人は分かると思うけど、ローカル座標は自分から見て上下左右の座標を指定する方法。対するワールド座標は部屋とかの空間全体の中で、目標になる座標がどこなのか?を指定する方法。
今回問題になるのは、例えば指のローカル座標を調整して鍵盤にめり込まないようにしても、手全体の位置のローカル座標を動かすと、いきなり指が鍵盤にめり込んじゃったりするわけです。
この「座標系を全部ワールド座標にすりゃいいのか?」とヒラメキました。
実は指をローカル座標にしてたのには理由があって、初期の実験では midi のコントロールチェンジを使ってたんで、分解能が127段階しかないので、狭い範囲で指定しやすいローカル座標を使ってたのです。
この場合、127段階を上手く使うために、モーションを取り込む際に、一度テストモーションを取り込んで、127の1つ1つの段階をいくつくらいの数値にすると動きが滑らかになるか?を判定するノーマライズプログラムを走らせて、最適化をはかってました。
例えば1メートルの範囲を127段階に分割すると、1つのステップは0.8センチ程度になってしまって、指の動きとかガッタガタになっちゃうわけです。
でも midi のコントロールチェンジは、分解能が低い代わりに、ひとつのチャンネルに100個くらいは別々に動かせる利点があります。つまり16チャンネルあるわけだから、1600個近いコントロールができるわけ。
これに対して、ピッチベンドは分解能が16000段階くらいある代わりに、1つのチャンネルには1つしか使えないから、1つのポートで16個しかコントロールができない!
普通の midi インターフェイスだと、10ポートくらいが平均だから、制御可能なパラメーターの数が少ない… とまあ、そんなわけでコントロールチェンジを使ってたわけです。
だけど、途中から midi インターフェイスをハードのインターフェイスから LAN のインターフェイスに変更したので、最大64ポート=1024個のパラメーターを16000段階の分解能で制御できるってわけです。
ま、この辺、必死になってやってるけど midi 2.0 が出て来たら、一発で解決しちゃう問題なんですよね。
で、とにかく明日は、ローカル座標でコントロールしてたパラメーターをワールド座標に変更して、鍵盤の表面の位置を絶対値にしちゃえば、スゲー簡単に問題は解決! しそうな気がするんだけど、どうかな?