さいてきか
のことを同時に考えながらIKの真似事っぽい複雑怪奇な処理を書くのは絶対よくない。それこそIKのCCD法のようにとりあえず大まかに目的の方向へ向くようにしてから細かく最適な方向へともっていくようにするべきだ。
注視点に首をむけるように仕向けたのだけども、注視点が首の後ろにある場合は当然そんな方向へ向く訳にはいかない。後ろを通過して一周するときにスムーズに首を切り返すことも考えて、後ろへ回ったときは注視点をそのまま顔面に平行な平面について鏡面対称に前にもっていってしまうことにした。だが座標系は顔面の方向に基づいているわけではないので単純にzを反転すればいいってわけにはいかない。ただ、顔面正面に向いているベクトルは分かっている。そこでこんな式を思いついたのであった。
Vlook_forward = Vlook_back + (-2.0) * dot(Vlook_back,Vface) * Vface;
Vlook_forward : 求めたい顔面の平面に鏡面対称な前向きのベクトル
Vlook_back : 判明している顔面後ろの注視点向きのベクトル
Vface : 顔面正面向きベクトル
(すべて単位ベクトル)
今はちゃんとこの方針の絵づらが頭の中に描けるのだが、たぶん半年後とかにこの行を見たら何これ?と一瞬思うだろうから書いておく。
余談:扱ってるのがとても生き物っぽくなってきてるのでコーディングを間違えて首がへし折れたり髪を振り乱してすごい勢いで首を振動させたりするのを見ると、スタブなモデルでやってるのと比べて非常に気持ちがやられる。これは予想外の欠点である。
(酔い度50%)
…ってこれ反射ベクトル出す公式そのままやんけ
(酔い度2%)