flex

そろそろFace Poserに進もうと思いいじってみたり文書読んだりしているのだが、 口パクや表情もなんかおかしいし、flex slidersを動かしても反応ない。 alyxにmale06のqcファイルをそのまま使うとflex関係の問題は何も起こらないが、 その代わり首の下にポリゴンの裂け目ができてしまう。 alyxにmdldecompilerから抽出したqcファイルを使うと、 首の下の裂け目はなくなるが今度は表情がおかしくなる。 良くみるとflexfileのframe番号がずれているので、 frame番号だけ直せば良いのかと思うのだが、 今度は表情もおかしいままに首の裂け目も残る。

alyxがCharacter Facial Animation Shapekey Set:jp に書かれている順番にフレームに表情が割り当てられているのではないのはもはや明白で、 もう他に方法も思いつかなかったので、 alyxからmdldecompilerで得られたqcファイルに書かれているフレームの通りに shape managerでキーをうち直してvtaを書き出すことにしたらうまくいった (正確に言えば、首が裂けずになんとなくまともにみえる、がほんとにうまくいってるかどうかはわからない)。

qcファイル。 ここでflexfileの中にはframe 5から29までが、欠番無く記述されている。 思うに昔はフレーム29まででflexを記述していたが、その後足りなくなってフレーム数を34まで増やし、 alyxなど古いモデルには昔のなごりが残っているのではないか。 また1フレームから4フレームまではflexfileに記述がないのだが、 少なくとも1フレーム目には目を閉じた表情のキーフレームを作っておかないとまばたきしない。

Barneyのqcファイルのflexfileの記述はこんな感じなのだが:

     flexfile "mdldecompiler_expressions.vta" {
          flex "upper_right" frame 2
          flex "lower_right" frame 4
          flex "upper_left" frame 6
          flex "lower_left" frame 8
          flex "AU42" frame 9
          flexpair "AU1" 1.0 frame 10
          flexpair "AU2" 1.0 frame 11
          flexpair "AU4" 1.0 frame 12
          flexpair "AU1AU2" 1.0 frame 13
          flexpair "AU12" 1.0 frame 14
          flex "AU12AU25" frame 15
          flexpair "AU15" 1.0 frame 16
          flexpair "AU17" 1.0 frame 17
          flexpair "AU10" 1.0 frame 18
          flex "AU16" frame 19
          flexpair "AU6" 1.0 frame 20
          flexpair "AU9" 1.0 frame 21
          flexpair "AU25" 1.0 frame 22
          flexpair "AU18" 1.0 frame 23
          flexpair "AU22" 1.0 frame 24
          flexpair "AU20" 1.0 frame 25
          flex "AU32" frame 26
          flex "AU24" frame 27
          flex "AU38" frame 28
          flex "AU31" frame 29
          flexpair "AU26" 1.0 frame 30
          flexpair "AU27" 1.0 frame 31
          flexpair "AU26Z" 1.0 frame 32
     }

これまたalyxともmale06とも全然違う独自のものである。 alyxとmale06 (standardflex_xsi.qci)はflexの名前(AU1とかAU2)などが同じなので類推可能なんだが、 barneyにはよくわからんのが含まれている。 順番もめちゃくちゃ。もうお手上げである。 おそらくこれは完全な憶測なのだが、 flexは最初、AU1とかAU2などの謎のコード名が決まり、 それにキャラの担当ごとに勝手にフレームを割り当てていたのだが、 開発者たちが「flexちょっと標準化しません?」 とかいう話になり、 主要キャラができた後、 一般のキャラを大量生産する手前で、 standardflex_xsi.qciなどのようなものを作る世話焼役が現れ、 おおむね標準化がfixしたのではなかろうかなあ。

それで、half-life2の中のalyxとかbarneyなどのキャラを置き換えようという場合には今のような不都合が起こるが、 まったく新しいゲームの新しいキャラを作るときにはmale06を元にスクラッチから作れば良いのであり、 ドキュメントに書かれたように作っていけば良いものと思われる。 male06を元にbarneyを作ろうとしたら、 barneyから取ったqcファイルの通りにvtaを作り替えなくてはならん (male06のqcを使おうとすると首が裂ける)のだが、 たとえばbarneyのupper_rightという特殊なflexがどういうものかは誰も知らないし、 たとえmdldecompilerからbarneyのvtaを抽出してもxsi mod toolはvtaをloadできないので、 結局barneyのvtaを再現することはvalveの内部の人ででもない限りわからんということだわな。

kleinerflexの記述は割とまとも。 standardflex_xsi.qciの中にすべてflexnameがある:

     flexfile "mdldecompiler_expressions.vta" {
          flex "AU42" frame 5
          flexpair "AU1" 1.0 frame 6
          flexpair "AU2" 1.0 frame 7
          flexpair "AU4" 1.0 frame 8
          flexpair "AU1AU2" 1.0 frame 9
          flexpair "AU12" 1.0 frame 10
          flex "AU12AU25" frame 11
          flexpair "AU15" 1.0 frame 12
          flexpair "AU17" 1.0 frame 13
          flexpair "AU10" 1.0 frame 14
          flex "AU16" frame 15
          flexpair "AU6" 1.0 frame 16
          flexpair "AU9" 1.0 frame 17
          flexpair "AU25" 1.0 frame 18
          flexpair "AU18" 1.0 frame 19
          flexpair "AU22" 1.0 frame 20
          flexpair "AU20" 1.0 frame 21
          flex "AU32" frame 22
          flex "AU24" frame 23
          flex "AU38" frame 24
          flex "AU31" frame 25
          flexpair "AU26" 1.0 frame 26
          flexpair "AU27" 1.0 frame 27
          flexpair "AU26Z" 1.0 frame 28
     }

男キャラはBarneyはあきらめてKleinerにしようかな。

で、d1_trainstation_05というチャプターなのだが、 ここのalyxはとても表情が豊かで、他のチャプターではこんなにまばたきをしたりしない。 最初に作られた開発者向けのチュートリアルでもあったのだろう。 そうとうきっちりと作られている。 alyxがうまくできているかどうか確認するにはちょうど良いシーンである。 例によってwmvの動画を置いておく: nesan_glasses.wmv

このムービーには開発を途中で放棄したジャージおじさんがBarneyとして登場している。

まあ多少不具合は残っているがFace Poserに進むことにしよう。 同じ場所に立ち止まっているヒマはない。