カスタムキャラクターを作る
by Hanabusa Nishika "2ndDeer"
(2007年2月掲載)
(Orange Box用に一部追記 2008年10月)
キャラクターモデルを本格的に作る方は少ないみたいです。実際にモデルをコンパイルしてみると、思わぬ問題に出くわすのですが、あまり情報がありません。モデリング自体よりも、コンパイルの行程で悩む事が多いのです。そこで、これからモデルを作ってみようという方の為に、このようなチュートリアルを書いてみました。
このチュートリアルでは以下のように、応用範囲が広いと思われる方法を扱います。
- hl2のAlyxを置き換える(ep2でも同様です)
- フェイシャルアニメーションを作る
- 既存のウェイトマップを修正して流用
このチュートリアルでは以下の事柄は扱いません。
- XSIでのモデリングの仕方
- 新しいアニメを作る
- 新しいボーンを追加する
下記のツールを使用します。
- 既存モデルの抽出
[目的] 既存のモデルからReferenceモデルとqcファイルを手に入れます。Referenceモデルはweightmapの加工に利用し、qcファイルはコンパイル用の雛形とします。
- GCFScapeで\Steam\SteamApps\source models.gcfを開きます

- 図のように、まず、Mossmanのモデルファイル6つを選択し、右クリック「Extract」します。

※汎用性が高いウェイトマップを手に入れる為にMossmanを選んでいます。もし貴方が男性のカスタムキャラクターを作っており、Barneyを置き換えたいのならば、相応しいモデルを選んでください。
- Extract Package Itemの場所はどこでもかまいませんが、この例では、Mod Toolで開きやすいように\Softimage\XSI_4.2_ModTool\Data\フォルダにしました。

- 今度は、上と同様にAlyxのモデルファイル6つを選択し、右クリック「Extract」し、適当なフォルダにExtract Package Itemしておきます。
※Alyxはqcファイルが目当てです。コンパイル時に使います。
- GCFScapeを終了します。
- mdldecompiler.exeを起動します。Choose Model Fileで先程のmossman.mdlを選び、Choose Output Directoryに出力先のフォルダ(この例ではmossman.mdlのあるフォルダ)を選択します。

- Extractを押します。モデルをloadしたというダイアログボックスが出ますのでOKを押します。

- モデルのデコンパイルが終了したというダイアログボックスが出ますのでOKを押します。

- 同様にalyx.mdlからもExtractしておきます。
ただし、こちらはコンパイル時まで使いません。
- mdldecompiler.exeを終了します。
- ウェイトマップの修正
[目的] 自作モデルでのエンベロープの調整を最小限にする為に、既存のキャラクターから、ゲームのSequenceに最適なweightmapを借りてきます。このようにすれば、ボーンが割り当てられていく順番(*)を一切考慮せずに済みます。ただし、そのままでは自作モデルとの形状に隔たりがあるでしょうから、このギャップをできるだけ埋めるべく、加工を行います。
* ボーンが割り当てられていく順番がズレると、既存のSequenceと不整合を生じます。
|
お断り: 私が試した範囲では、ModTool v4.2とv4.2用Valveアドオンとの組み合わせにおいて、ここに述べた方法でウェイトの転送が比較的上手くいきました。しかし、v5(以降)用アドオンではどうも仕様が異なるようで、上手くいかない場合が多くあります。原因はモデル間のトポロジの差異だと思いますが、v4.2用Valveアドオンでは、それらによる影響が上手いこと吸収されていたように思います。v5(以降)用アドオンではトポロジの差異がそのまま顕著に影響し、ウェイトがまるでデタラメに転送されてしまいます。
|
- XSI Mod Toolを起動します。
- 貴方が完成させたカスタムキャラクターを開きます。
- ValveSource → Import SMDでデコンパイルしたmossman_reference.smdを開きます。

Texture Pathは空欄でかまいません。

- 作業をしやすくする為、Camera Displayのオプションを開き、Show Wireframe on Unselected ObjectsとShow Transparent Selected Wireframeにチェックを入れます。Head Lightにもチェックを入れておくと見やすいでしょう。


拡張コンポーネント選択を使いたくない場合、PreferencesのSelection → General Options → Extended Component Selectionのチェックを外しておく事を忘れないでください。(v4.2の場合)

- Scene Explorerを開き、ValveBiped → mesh → Envelope Operatorをダブルクリックします。

必ず、Muteにチェックを入れてから作業を行って下さい。さもないと、ウェイトマップの編集結果が思わぬ事態を引き起こします。

やり直しをする場合に備えて、この段階のEXPを別名保存しておくと良いでしょう。
- Scene Explorerを開き、ValveBiped → meshを選択します。画面で白くハイライト表示されたのがMossmanのモデルです。

- 後のウェイトマップの調整を最小限に抑える事がこのチュートリアルの狙いです。Mossmanの輪郭を貴方の自作キャラクターに合わせましょう。
この作業での要点を上げておきます。
- Mossmanモデルが、貴方のカスタムキャラクターを(皮一枚くらいで)隠してしまうようにする。
- 頂点ポイントを移動する際には、できるだけ均等な状態を心懸ける。
- クラスタの境界にある頂点ポイントは重なっているだけで集約されていないので、バラバラにならない用に気を付ける。
頂点ポイントを矩形範囲でタグ付けする(*)時には、Wireframe表示が便利です。こうすれば、重なっただけの集約されていないポイントも一度に選べます(投げ縄選択だと、こうはならないので注意)。あらかじめ、Weld boundary point/edgeを0.01くらいで実行しておくのもよいでしょう。
* XSIのガイドでは、頂点やポリゴンを選択した状態にする事を「タグ付けする」と表現しています。
Mossmanと自作モデルの重なり具合を確かめる時には、Shaded表示が便利です。
このように、表示を適宜切り替えつつ作業を行います。
では、具体的な作業の例を述べます。
- 私のカスタムキャラクターは頭部がMossmanより上にあります。Mossmanの首から上を移動して、頭の高さを自作キャラクターと同じになるようにします。
- Tを押し、ポイント選択ツールにします。Wireframe表示のまま、矩形範囲でタートルネックの縁から上を全選択します。

- Vを押し、TransformでY軸方向を上に移動させます。鼻の位置が目安になります。
赤い部分がMossmanです。

- 頭部の位置を合わせた事により、これで、首の関節が適切な場所で曲がるようになったはずです。
- 私のカスタムキャラクターはロングヘアーですが、髪の毛には専用のボーンが無く、頭部と体に追随して動くだけです。ですから、髪の毛に関しては、Mossmanのウェイトマップを厳密に合わせておく必要はありません。
- 私のカスタムキャラクターは肩の位置がMossmanより上にありますので、Mossmanの肩を高くしてやれば良い事になります。
- 肩関節は、重要度が高い部位です。関係するボーンも多く、最も複雑な動きをします。
- そこで、トランスフォームツールだけでなく、スケールツールも使って、Mossmanの肩周辺のポリゴンを可能な限り均質な状態で拡大してやります。Mossmanの体の左右の巾(X軸)だけでなく、前後の巾(Z軸)も考慮してスケールの量を加減して下さい。
ここは最もトリッキーな部分なので、少々の失敗も覚悟しておいて下さい。
- 私のカスタムキャラクターはお尻が出っ張っていますので、上と同様にMossmanのお尻周辺の頂点ポイントを盛り上げます。
- 私のカスタムキャラクターは腕の位置がやや前よりで、二の腕には覆いが付いています。ここも上と同様にMossmanの二の腕をスケールツールを使って太くしてやります。スケーリングの際、ピボットを腕の中心に設定する事を忘れないでください。
以上のようにして、Mossmanの輪郭を変更する作業が終わりました。念のため、Freeze Mをしておきましょう。
- Scene Explorerを開き、ValveBiped → mesh → Envelope Operatorをダブルクリックします。必ず、Muteのチェックを外してください。
- ValveBiped → meshが選択された状態で、ValveSource → Weightmap Exportします。
- nullリグの流用
[目的] リグだけを抜き出します。このリグはゲームで使われているものと同じです。ValveアドオンのDefault Female Rigとは少し差異があります。このチュートリアルでは、ValveアドオンのDefault Female Rigは使いません(使うといろいろと面倒な事態が起きるからです)。
nullリグ(後述)を使うと、コントローラーが無いため、ポーズを弄ってエンベロープの具合を確かめる事ができませんが、上で行ったweightmapの修正により、これを割愛(もしくは省力化)できるはずです。
- (上の最後の状態から続いています)Scene Explorerを開き、ValveBiped → meshを選択します。Mossmanモデルは、もう不要なので、deleteキーを押して削除します。
残ったValveBipedを、このチュートリアルでは「nullリグ」と称します。コントローラーが全く無いリグで、アニメーションを付けるには向いていませんが、既存のSequenceと馴染みやすいリグです。
- ウェイトマップの流用
[目的] ゲームのSequenceに最適なweightmapを借りる事により、既存のリグとSequenceとに調和したモデルが完成できます。
- (上の最後の状態から続いています)2. ウェイトマップの修正でExportしたMossmanのWeightmapを使います。
- Scene Explorerを開き、自作モデルが選択された状態で、ValveSource → Weightmap Importします。
- 表示をConstantにしてみましょう。頂点ポイントにカラフルな色が割り当てられています。
- 目のアイコンをクリックして開いたプルダウンメニューから、Weightmapにチェックを入れます。
- エンベロープ設定の状態が色分けで識別できるようになりました。
- ボーンと関連付けされたウェイトが全くないポリゴンは黒色になるはずです。そうしたポリゴンが無い事を確認します。
- 頭と首の境(アゴから上)は単色になっているはずです。そうでなかった場合、上の行程でミスを冒している可能性がありますが、ウェイトエディタで編集して直せるか試しましょう。
- WeightmapをImportした事により、他のチュートリアルやガイドで説明されているような「Animate: Deform → Envelope → Set Envelope」を行う必要はなくなりました。
EnvelopeのWeightmapを調整し直さなければならない場合: nullリグにはhelper boneが付属しています。helper boneは、Sequenceを司るboneではありませんが、関節の変形を若干補う働きがあり、活用することで自然な曲がり方を再現できます。weightとしては、数十〜数%を割り当てるのですが、必要以上に割り当て過ぎるとモーションが破綻する恐れがあります。例えば、肘と手首の間にあるhelper boneに必要以上のweightを割くと、腕が曲がるときに異常な変形をしてしまいます。コンパイルして腕や足がグネグネしていたら、helper boneのweightを疑ってみて下さい。なお、null表示されたboneはXSI上では×印でしかなく、一見してhelperかそうでないかは区別できません。骨構造定義ファイル(commonbones.qci)の作り方の5番にhelper boneのリストがあります。スケマティック等で構成を確認してください。
|
- SMDの出力
[目的] コンパイルに必要なSMDファイルを作ります。
- (上の最後の状態から続いています)自作モデルを選んだ状態で、忘れずにFreeze Mをしておきましょう。
- Scene Explorerを開き、ValveBipedをミドルマウスボタンクリックし、そのままShiftキーを押しながら自作モデル(mesh)をミドルマウスボタンクリックします。これにより、ValveBipedのツリーと自作モデル(mesh)のツリーが全選択されました。
- この状態で、ValveSource → Export SMDします。オプションの"Remove All Unused Bones"にだけは、チェックをはずしておきます。自作モデルのファイル名を付けましょう。
- XSI Mod Toolを終了します。
- フェイシャルアニメーションを作る
[目的] コンパイルに必要なVTAファイルを作ります。この行程はMod Tool(v4.2)でも行えますが無意味です。なぜなら、Mod Tool(v4.2)ではVTAファイルが出力できないからです。なお、現在では、XSI評価版の代わりにMod Tool v6を使う事が出来ます。Mod Tool v6にはMod Tool v4.2のような制限がありません。
- XSI評価版(この例ではv5.11)を起動します。
あらかじめv5.11用のValveアドオンをインストールしておいてください。
- Import SMDで自作モデルを読み込みます。
XSI Mod Toolでセーブしたexpファイルは評価版/製品版のXSIでは開けません。
なお、評価版XSI v6でセーブしたscnファイルはv5.11では開けませんし、XSI v5.11で保存したscnファイルはv4.2では開けません。バージョン相互のファイルの互換性に注意しましょう。
補足: あらかじめMod ToolでdotXSI形式をExportしておき、それを読み込むという方法もあります。ただし、Mod Tool(v4.2)には4,000ポリゴン(Rig付きでは7,500ポリゴン)の制限があるので、難しい場合もあるでしょう。制限をやり過ごすには、自作モデルを制限に収まるように分割してExportするしかありません(Importしてマージします)。エンベロープは再設定しなくてはならないでしょう。
- 表情を付けるべき「顔面」の頂点ポイントをタグ付けします。
左右の目も含まれます。口内(fmouthのテクスチャを貼っている部分)は選ばないでください。
- Shape Managerを開きます。
shape modelingモードになった事を確認してください。
- Edit → Cluster → New from selected points
- Resultの下に、Point - default - ShapeKeyが出来ました。
- 今度は「下の歯」の頂点ポイントをタグ付けします。
- Edit → Cluster → New from selected points
- Resultの下に、Point1 - default - ShapeKey1が出来ました。
- SDK_Male_reference.scnに則って、リネームしておくと解りやすいでしょう。Scene Explorer(*)上で、先程作った最初のポイントクラスタをanim_face、二つ目をanim_teeth_lowerとリネームしてください。
* Shape Manager上では、この部分のリネームはできないからです。
- ShapeKeyとShapeKey1を雛形として複製し、Character Facial Animation Shapekey Set:jpに則って、表情のライブラリを作っていきましょう。
SDK_Male_reference.scnがとても参考になります。
- ライブラリが全部揃ったら、念のため、Freeze Mをしておきましょう。
- 今度は「アニメート」タブに切り替えて、キーを設定していきます。
- まず、フレーム0で一番先に作ったShapeKeyとShapeKey1のスライダ値を1にして、最初のキーを設定します。
- 以降はフレームの目盛りをひとつずつ右へずらしていき、使うライブラリのスライダ値を1に(残りは全て0に)して、キーを設定していきます。
「下の歯」が動くのは、30〜34フレームです。31と32は同じもの、33と34は同じもの、でかまいません。
- 34フレーム分を作り終えたら、ValveSource → Export SMDします。
Scene Explorer上で、ValveBipedをミドルマウスボタンクリックし、そのままShiftキーを押しながら自作モデル(mesh)をミドルマウスボタンクリックして、ValveBipedのツリーと自作モデル(mesh)のツリーを全選択した上で行います。
この時、SMDではなくVTAを選んでください。拡張子もVTAを選んでください。
注意: mdldecompilerの作ったフェイシャルアニメーションの記述は、Valveデフォルトのものと齟齬があるようです。hlmv.exeでFlex閲覧中、スライドバーで目蓋等が動かなかったりしたら、 \sourcesdk_content\hl2mp\modelsrc\humans_sdk\ にある standardflex_xsi.qci や facerules_xsi.qci と記述の内容を比較し、適宜修正してください。なお、Episode OneのAlyxはHalf-Life 2無印よりも表情のバリエーションが増えており、Character Facial Animation Shapekey Set:jpやmdldecompilerには、新規分が網羅されていません。hlmv.exeでのFlexはEpisode Oneがデフォルトになっているようです(実際にflexが未実装でも、欄が表示される)。また、source 2007 shared models.gcf に含まれているAlyxやMossmanをデコンパイルすると未対応のflexはBad stackと記述されます。
|
- コンパイル(Alyxの置き換えモデル)
[目的] Alyxの代わりとしてシングルプレイヤーゲーム内で動く自作モデルを出力します。コンパイルのやり方に関する基礎事項は、他の記事を参照してください。
- 以前の行程でデコンパイルしたAlyxのmdldecompiler.qcを流用します。
- コンパイルの前に、必要なファイル(smd、vta、qc)を
\Steam\SteamApps\[ユーザー名]\sourcesdk_content\hl2\modelsrc\[自作モデル名]\
|
におきます。※これはHalf-Life 2無印の場合です。
Episode Oneでは
\Steam\SteamApps\[ユーザー名]\sourcesdk_content\episodic\modelsrc\[自作モデル名]\
|
Episode Twoでは
\Steam\SteamApps\[ユーザー名]\sourcesdk_content\ep2\modelsrc\[自作モデル名]\
|
同様に、以下の3と4も下線部を赤字のように変更してください。
|
phymodel.smdとragdoll.smdはAlyxのものをそのまま使います。
- マテリアル(tga)の配置場所は
\Steam\SteamApps\[ユーザー名]\sourcesdk_content\hl2\materialsrc\models\player\[自作モデル名]\
|
です。
vtex.exeを使ってあらかじめvtfへ変換しておきます。
- ゲームが参照するマテリアルのフォルダは
\Steam\SteamApps\[ユーザー名]\half-life 2\hl2\materials\models\player\[自作モデル名]\
|
になります。
vmtも忘れずに配置してください。白目と瞳と口内には専用のシェイダーを記述する事になっています。
- それでは、mdldecompiler.qcをテキストエディタで開いて編集します。
- まず、qcファイル自体の名前を自作モデルの名称にしておくと良いでしょう。
- qcファイルに記述されているalyx_reference.smdを、自作モデルのSMDの名称に変更します。
- 一行目の$cd のパスを正しいものに書き換えます。
- $lod 10から$shadowlodまでの行はコメント行にします。
貴方がLODモデルを用意しているならば、コメント行にせずに、正しいファイル名に書き換えてください。
- $cdmaterialsのパスは必ず正しいものに書き換えてください(デフォルトのままでは間違っています)。
- 目の位置を自作モデルに合わせて正しく指定してください。(以下の三行)
eyeball righteye ValveBiped.Bip01_Head1 -1.300 -2.934 65.202 eyeball_r 1.000 4.000 pupil_r 0.682
eyeball lefteye ValveBiped.Bip01_Head1 1.315 -2.934 65.211 eyeball_l 1.000 -4.000 pupil_l 0.682
$attachment "eyes" "ValveBiped.Bip01_Head1" 2.81 -3.89 -0.00 rotate 0.00 -80.10 -90.00
|
位置の指定方法は、目玉の入れ方で述べられているページが参考になります。
- mdldecompiler_expressions.vtaを、貴方が出力したVTAの名称に書き換えてください。
- Steamを起動します。ご存じのように、Steamクライアントが常駐していないと、コンパイルが出来ません(オフライン・モードでかまいません)。
- コンパイルを行う前に、Source SDKのメニューのCurrent Gameの欄がHalf-Life 2になっている事を確認してください。

※Episode One、Orange Box(Episode Two)の場合は、それぞれ対応したゲームを選んでください。
- studiomdl.exeでコンパイルします。エラー表示が出ていない事を確認します。
studiomdl.exeへのパスは、Orange Box対応にしたいのかEpisode One対応にしたいのかで変わる場合があります。詳しくは、studiomdl.exeによるコンパイルを参照してください。
|
ERROR: 'EXCEPTION_ACCESS_VIOLATION' (assert: 1)
|
というエラーが出る場合には、hlmv.exeを起動させた状態で、コンパイルを実行してみてください。
- hlmv.exeでalyxモデル(*)をloadしてみましょう。Modelタブを参照して、ボーンの数が73になっているか確認してください。
* 貴方が置き換えたモデルです。
- Ragdollでポーズに歪みが無いかよく見ます。
ここで歪みが見られる場合、XSI Mod Toolの段階に戻って、エンベロープの該当個所にスムーズを適用(*)してやる事で大抵は解消されると思います。
* Weight Paint Panelでペイントモードをスムーズにしてから、ペイントツールでペイントするか、もしくは特定の頂点ポイントを選択し「スムーズの適用」ボタンを押します。
- Sequenceをいくつか実行させてみます。
デフォームが期待通りでなかったら、XSI Mod Toolの段階に戻って、エンベロープの該当個所をウェイトエディターやペイントツールで微調整してください。
著しく期待と異なる場合には、Mossmanのweightmapを調整するか、編集をやり直す事も考えてください。指先のように、どうしても納得できないデフォームも時にあるでしょうが、妥協も必要です。オリジナルのAlyxでも些末な部分はアバウトだったりするものです。
おかしい時のチェックリスト:
- コンパイル時に"ERROR: ikchain 'rhand' too close to root, noparent knee/elbow."といったエラーが出る。
□ Export SMDの時に、"Remove All Unused Bones"のチェックを外す事を忘れていませんか。
- Ragdollでは問題ないがSequenceを実行させると、手や足が異様にグネグネしたり、おかしな変形をする。
□ Freeze Mはしましたか?
□ Mossmanの編集作業を行う際、ValveBiped → mesh → Envelope Operatorをダブルクリックして、Muteにチェックを入れた上で行いましたか?
□ あるいは、Mossmanの編集作業で、相応しく無い頂点ポイントを極端に移動させ過ぎたのかもしれません。
- 脇の下あたりが、体を突き抜けてしまうくらい極端に凹んでいる。
□ ウェイトのミラーを行いませんでしたか? 対称マップ テンプレートを弄ってValidateすると、間違った割り当てが行われてしまう事があるようです。
□ Mossmanではなく、Alyxのweightmapを編集して使っていませんか? Alyxにはジャケットの裾が存在するので、貴方のキャラクターと形状が異なると、ウェイトが正しく割り当てられない場合があります。
□ とはいえ、時々、そうなる事があるみたいです。付近のボーンへのウェイトの割り当てが混同されて、上手くいかなかったのでしょう。ウェイトエディタで直せるか試してください。
- Ragdollでは問題ないがSequenceを実行させると、体全体が横になったり、腰から下が横になる。(*)
□ Nullリグを使いましたか? ValveアドオンのDefault Female Rigだと、そうなる場合があります。
□ 既存モデルのweightmapを流用しましたか? 流用せずに「Animate: Deform → Envelope → Set Envelope」でエンベロープをこしらえると、そうなる場合があります。
- ボーンの数が73(Femaleの場合)より少ない。
□ ValveアドオンのDefault Female Rigで、Envelope_Deformersに「Animate: Deform → Envelope → Set Envelope」すると、そうなる場合があります。
□ 正しい行程を踏んだにもかかわらず、そうなる場合は、Bip01_Lattの有無を確認してください。時々、無くなってしまう事があるようです。デフォームに問題が無いようなら、無視してもかまわないでしょう。
- 目が紫と黒のチェッカーになっていて、そこだけテクスチャが表示されない。(または、テクスチャが全然表示されない)。
□ 白目と瞳には専用のシェイダーを記述する事になっています。テクスチャとvmtをゲーム用のパスに配置していますか? tgaをvtfへ変換していますか? vmtのパスの記述に間違いはありませんか?
□ XSIで、自作キャラクターにテクスチャ・イメージをきちんと割り当てていますか? Export SMDの際、テクスチャ・イメージが割り当てられていないポリゴンは出力されません。
- 瞳の位置や追随がおかしい。
□ qcファイルでの目に関する記述を確認して、適切に変更してください。
□ $attachment "forward" の行がqcにありますか? これが無いと、左右の目の追随がおかしくなるそうです。
□ ValveアドオンのDefault Female Rigを使い、且つ、「Animate: Deform → Envelope → Set Envelope」で各ボーンに対して順番にPickを行っていても、目の追随がおかしくなる事があるようです。(*)
* 解決策として、Default Rigをエンベロープしコンパイルすると、hlmv.exeで見た時に腰がヘン(Sequenceを実行させると横になる)の正しい骨構造の定義ファイルをincludeする方法も参考にしてください。ただし、この方法だと、エンベロープのウェイトがなめらかではなくなると思います。
|
全て良好なら、ゲームを起動して、実際に置き換えモデルを検証してみましょう。瞬きや口パクが綺麗に行われているでしょうか。
|