Ja/Viewmodels in XSI

Viewmodelの製作
==カメラの設定==
まずXSIの中で、ゲーム内での武器モデル表示に近い表示を得られるようにカメラ位置を設定します。以下のA.そしてB.の2つの異なる方法で行うことが出来ます。ソースエンジンはどんな視野角(F.O.V.)もサポートしますが、54(人の目に近い値)を使うとエンジンでの表示のときに破綻することなく正しい縮尺で武器モデリングを行うことが出来ます。実際のところソースエンジンでは2つの視野角システムを使っています。Half-Life2では世界は視野角75度で、そして武器は54度でレンダリングされます。
(A.) 原点0,0,0に視野角54度のパースペクティブカメラをZ軸正方向に向かうように配置する。
(B.) 原点に視野角54度のパースペクティブカメラを配置し、下の画像の座標に移動させ、Z軸正方向に沿って配置する。QC command $Origin 0 0 68を使って位置を補正する。これはアニメーションを行うキャラクタリグをマージするときに役立ちますが、そうでなければ(A.)を使うことをすすめます。
(XSIのcamera_interestエンティティを使って、武器の向きを表示させることができます。これをカメラの正面、約50ユニット先に置いて、武器の狙いがスクリーンの先にあるかないかを確かめることができます)
==位置決め==
まだシーンに読み込んでいない場合、武器メッシュのマージ/読み込みを行います。カメラビューで一番よく見える場所に武器を配置します。この時武器メッシュを移動させ、カメラは移動させないようにします。これをモデル完成前に行うことをすすめます、というのもどこにポリゴンを使うのが最良が見ることができるからです。下の画像で見ることができるように(Aと書かれたエリア)ショットガンの正面のメッシュの銃身近くはカメラビューから見えないのにディティール付けがされています。これらのポリゴンはハンドル近くに使うか、削除したほうがよいかもしれません。
==テクスチャ座標のマージ==
この例では、ショットガンと腕はモデリング、テクスチャ設定が別々に行われました(想像力をつかってこの例はテクスチャ付けがされている、と思ってください)。ビューモデルの武器(一人称ビューでの武器)は単一のメッシュで構成される必要があるので、テクスチャ座標を保ちつつショットガンと腕のメッシュを1つにする必要があります。まず、ファイル>;マージ(File >; Merge)で腕のメッシュを同じシーンにマージし、次にModelパネルの作成 >; ポリゴンメッシュ >; マージ(Create >; Poly. Mesh >; Mergeを実行します。下の画像のようなダイアログボックスが表示されます。私は通常の場合、許容範囲(tolerance)を0にします。許容範囲より近い頂点は1つにまとめられます。許容範囲が大きいほど多くの頂点が接続されることになります。モデリングの片側だけ作り、複製して対称に移動し、それから接続して元に戻すといったように、これは2つのモデルをつなぎ合わせるときに有用です。この例においては、私は武器の頂点と手の頂点が接続してほしくはないと思いました。すべて(All)をクリックして、全てのマテリアルとテクスチャを単独のメッシュにマージします。
XSIはマージの後新しいメッシュを作ります(Polymeshという名前)。古いメッシュを削除するまえに新しいメッシュをフリーズしてください。
==リギング==
メッシュをリグに接続しましょう。ここで私は銃をつかむ手に指のリグも使っていますが(figure A.)、最終版では手とショットガンの回転と移動をコントロールする単独のボーンを使います(figure B.)。ボーン数が多いのはコストが高く、ビューモデルは視点から近いためキャラクタモデルのようにボーンLOD（Level of Detail、距離によってボーンの詳細度を切り替える）の恩恵を受けることができません。もし指を動かす必要があるのなら(トリガーを引くなど)、手のボーンの子として一つだけボーンをシーンに追加してください。私が作る右手(銃を持つ手)は通常3つのボーンから構成されています。肘、手、銃に一つずつです。この例では肘と手の2つしか使っていません。というのも手がショットガンのハンドルを放すことがないからです。もちろん銃にクリップ、ボルトといった動くパーツがあるならそこに追加のボーンが必要でしょう。
武器のリグを作成する前に計画を立てましょう。作るアニメーションでハンドルを放すことがないとわかったなら、右手の全ての指にボーンを入れないようにします。
左手のリグをどうするかはアニメーションの必要によります。このショットガンでは、リロードアニメーションを行うために関節を用意しています。これはとても古い例で(古いリグを使っています)、左手の最後の2本の指は同じボーンコントロールを使うようにしたかもしれません。
リグを設定してアニメーションをつけたら、カメラのビューポートから見えない面を全て削除します。リファレンスsmdファイルを再び出力します。下の例では肘から肩の面を削除しました。他に見るべき場所は、前腕の右下、右手の裏側、そしてショットガンの右面と下面です。
==QCファイルの編集==
下がショットガンのqcファイルです。わかりにくいいくつかのコマンドを説明します。
$Origin 0 0 68 - 上で述べたように、XSIでプレイヤの視点高さでアニメーションを作った補償を行います
$Attachment - 例えばmuzzleアタッチメントはマズルフラッシュのスプライト/効果が起こる場所を指定します。 の親となるボーンを作る簡単な方法のひとつはXSIでボーンにヌルを親子付けすることです。出力するときに未使用のボーンを残す設定にすることを忘れないでください!
Nodes - キャラクタに現在どの状態にいるかを伝えるためにノードを使います。下の例では、武器が友好的なNPCに向けられてるかどうかを示すのにノードを使っています(HL2では、友好的なNPCに武器を向けると、武器を降ろすようにしています)。この機能が必要ないなら自分の武器からこれらのノードコマンドを除いてください。
$modelname weapons/v_shotgun.mdl
$body studio "Shotgun_reference.smd"
$origin 0 0 68
//Muzzle flash
$attachment "muzzle" "ValveBiped.Muzzle" 0 0 0 rotate -90 0 0 rigid
//Shell eject
$attachment 1 "ValveBiped.Eject" 0 0 0 rotate 180 0 0 rigid
$sequence idle01 "Idle01" loop fps 30 activity ACT_VM_IDLE 1 node 0
$sequence fire01 "Fire01" fps 30 snap activity ACT_VM_PRIMARYATTACK 1 { event AE_MUZZLEFLASH 0 "SHOTGUN MUZZLE" } node 2
$sequence altfire "Alt_fire01" fps 30 snap activity ACT_VM_SECONDARYATTACK 1 { event AE_MUZZLEFLASH 0 "SHOTGUN MUZZLE" } node 2
$sequence draw "Draw" fps 30 snap activity ACT_VM_DRAW 1 node 0
$sequence holster "Holster" fps 30 activity ACT_VM_HOLSTER 1 node 0
$sequence reload1 "Reload_start" fps 30 activity ACT_SHOTGUN_RELOAD_START 1 node 0
$sequence reload2 "Reload_load_shell" fps 30 activity ACT_VM_RELOAD 1 node 0
$sequence reload3 "Reload_finish" fps 30 activity ACT_SHOTGUN_RELOAD_FINISH 1 node 0
$sequence pump "Pump" fps 30 activity ACT_SHOTGUN_PUMP 1 { event 6001 5 "2" } node 0
$sequence dryfire "Dryfire" fps 30 activity ACT_VM_DRYFIRE 1 node 2
$sequence lowered "Non_threat_idle01" loop activity ACT_VM_IDLE_LOWERED 1 node 1 
$sequence lowered_to_idle "Non_threat_to_idle01" activity ACT_VM_LOWERED_TO_IDLE 1 transition 1 0
$sequence idle_to_lowered "Idle01_to_non_threat" activity ACT_VM_IDLE_TO_LOWERED 1 transition 0 1
ハッピーハンティング!!