インジェクション
2008年02月29日(Fri)
Poserの自由度の高さの一つに、Poseファイルを本来の目的以外に利用できることがある。その例の一つがMATファイルだが、他にもPoseファイルはフィギュアのあらゆる情報を上書きすることできる。モーフチャンネルも例外ではない。内部名をきちんと指定すれば、目的のモーフチャンネルの値だけでなく、モーフデルタ自体も書き替えることが可能なのだ。
これを利用して、あたかも新しいモーフチャンネルが追加されたように見せかけるのがインジェクションである。見せかけるということは、つまり実際は追加されているわけではない。
- キャラクターファイルの該当バーツにモーフデルタが空のモーフチャンネルを用意する。外部名には適当な名前を付け、パラメータパレットに表示されないよう非表示にしておく。
- Poseファイルを用いて用意した空のモーフチャンネルの内部名を指定し、そのモーフデルタを上書きする。
- 同時にモーフチャンネルの外部名を分かりやすい名称に変更し、非表示から表示に変更する。
これがINJファイルが実際にやっている動作である。REMファイルの場合は2と3を逆に辿り、
- モーフチャンネルを表示状態から非表示状態に変更する。
- モーフデルタを上書きして空白にする。
を行っている。モーフデルタが入るべきチャンネルは既に用意されていて、その内容を書き替えているのである。この予め用意されたモーフチャンネルを空きチャンネルという。空きチャンネルは普段非表示状態になっているから、新しいダイアルが追加されたように見えるのだ。
古いINJファイルでは、モーフデルタを上書きする部分と表示/非表示を切り替える部分を分割して2回記述しているものがある。また、INJ/REMファイルの中には適用時に自動的にダイアルの値も変更するものがあるが、これも分割されていることが多い。おそらく、過去のバージョンではこれらの操作を同時に行うことができなかったか、Poserの動作が不安定になるなどの弊害があったのだろう。現在、少なくともP6以降ではまとめて記述しても問題なく動作する。
では、びっきさんを例にしてファイルの中身を見てみよう。
Victoria 3 SAE.cr2をテキストエディタで開くと、空きチャンネルが大量に用意されていることがわかる。モーフセットが入る名前のついたチャンネルの他にも、PBMDC~とかPBMCC~とかいう内部名の空きチャンネルがある。これらはキャラクターセットなどを使用するときに利用できるチャンネルである。DCがDAZ専用チャンネルで、CCがCommon(共用)チャンネルだ。

この状態では非常に簡潔な記述しかされていないが、Poserにロードすると動作に必要なデータが付加される。ここに適当なモーフをインジェクションしてみると、

このように、内部名と表示/非表示、そしてモーフデルタの部分が変更される。
DAZのモーフセットのINJ/REMファイルは、実際には "readScript" 命令によってモーフデルタ用の外部ファイルと表示切替用の外部ファイルを参照している。

readScriptはロード時に外部ファイルを読み込む命令である。ファイルを細分化することで、(例えばAll Morph INJと個別のINJ等で)モーフデルタの記述が重複することを避けることが可能になる。ただ、これは同時にPoserのどうしようもない仕様によって、非常に面倒くさい問題を引き起こすことになるのだが……そのへんは、またいずれ。
インジェクションの登場で、まず第一にモーフの追加が容易になった。モーフの追加や削除の操作はそれほど難しくはないが、一度に大量のモーフを追加するとなると手間暇がかかる。Poseファイルを適用するという単純操作でこれを解決できるのだから、キャラクターセットの配布やモーフセットの販売に大きな弾みをつけたことは疑いないだろう。
またインジェクションはキャラクターファイルからモーフデルタを分離し、ユーザーが必要とする分だけを追加することを可能にした。モーフデルタは前回説明した通り、頂点の移動距離を示したものである。ユーザーがリアルさを追求し、フィギュアがハイポリゴンになればなるほど、頂点の数は増えモーフデルタの行数は飛躍的に増大する。モーフデルタのために費やされるディスク容量の増加はPoserが宿命的に抱える問題である。D|SをリリースするまでのDAZにとっては、このインジェクションが一つの回答だったのだろう。
ところで、インジェクションにはその発想からして根本的な問題がある。それは、あらかじめキャラクターファイル内に空のモーフチャンネルを大量に用意していなければならないという点である。また、チャンネル数が充分に用意されていたとしても、誰がどのチャンネルを使用するかはまったくの任意である。2つのキャラクターセットがあったとして、それが同じ空きチャンネルを使用していたら、先に適用した方が後から適用されたモーフで上書きされ消えてしまうのだ。このチャンネルのコンフリクト(衝突)を回避するのが、V4.1から導入されたExPである。
個人的には、使用されない空きチャンネルの容量も馬鹿にならないと思うのだが、DAZはそのへんはもう開き直ってしまったようである。そんなわけで、続きは次回。