
いわゆるIK(インバースキネマティクス)ってどのくらい難易度高いのかなぁと思って、無謀は承知でトライしてみた。インバースキネマティクスのアルゴリズムに関しては、これっぽっちも解ってないので、とりあえずLightWave触ってた時の手順と印象で探りを入れてみる。
形状のペアレント
LightWaveでIKするには、目的のオブジェクトをペアレント(親子関係)する必要があるので、ひとまずこれをPV3Dでやってみる…といっても単に階層上にaddChild()すればペアレント終了。例えば、Arm01、Arm02、Arm03という3つの形状で階層を作るなら、
rootNode = scene.addChild( new DisplayObject3D( "rootNode" ) );
rootNode.addChild( Arm01,"Arm01" );
Arm01.addChild( Arm02,"Arm02" );
Arm02.addChild( Arm03,"Arm03" );
ってな感じで、入れ子にaddChild()しておけば親オブジェクトの移動や変形に子オブジェクトが追随するペアレント指定が完了。ここまではムービークリップの概念そのまんまなので、さすがのオレでもすぐに出来た。
IKっぽいことをしてみる
「逆運動学」とかで検索して、それっぽいサイトをいくつか見て回った結果、要は「ゴールオブジェクトの位置で、他のオブジェクトの姿勢が決まる」ってことが満たされればいいんじゃね?いいんでしょ?イイ!という凡人なんてこんなもんですよ的発想を下敷きに、なんとかしてベクトルだの行列だのを駆使しなくてもできる方法が無いもんかと考えた揚げ句に閃いたのが、ゴールオブジェクト以外のオブジェクトを全部lookAt()使ってゴールオブジェクトの方向向ければいいんじゃね?というアホみたいな発想。さっきの例でいうと「Arm03」をゴールオブジェクトにするとして、
Arm02.lookAt(Arm03);
Arm01.lookAt(Arm03);
こんな感じ。
んで、実際にやってみたのがこれ。※要:Flashplayer9
黄色いパーツがゴールオブジェクト。
び、微妙。なんかソレっぽく動いたけど、どうにもインチキくさい。ていうかほぼ間違いなくインチキIKだろこれ。どっちにしてもこれじゃ関節ごとの動きの制限とかどうすればいいか全然わかんないし、やっぱりちゃんと自分でベクトルとか使ってやらないとダメっぽいなぁ。なんとなく、lookAt()メソッドがやってる事にヒントがありそうな気がするので、そのへんから攻めてみよう。