今回はアニメーション付きアイテムの作成方法を紹介します。
アニメーション付きアイテムとは"センチュリオンのダイナモ・コア"や"蝶入りの瓶"のような、動くアイテムのことです。日本語での詳しい解説がまだ無いようなので、今回はその作成方法を紹介します。
因みに今回の完成品はこちらです。
必要なツール
- Blender 2.7+ ダウンロード
- Nif plugin for Skyrim ダウンロード 参考サイト Skyrim MOD作成 Wiki様
- NifSkope ダウンロード
- ToolsPack to work with Blender 2.7 ダウンロード
- ChunkMerge ダウンロード Template nif ダウンロード
手順
- 事前準備とモデルの作成
- Blenderでモデルにボーンとウェイトを付ける
- アニメーションを作成
- Mesh Animatorでアニメーション付きnifを作成
4-1.アニメーションとモデルを出力
4-2.NifSkopeで編集
4-3.BodyAnimatorで統合 - ChunkMergeでコリジョンを作成
- NifSkopeで仕上げる
番外編. インベントリ内でアニメーションさせる
1.事前準備
先に必要なツールをインストールしておきましょう。ToolsPack to work with Blender 2.7の中には複数のツールが入っていますが、今回使用するのは「Animation Tools N4 - Mesh Animator」のみです。これは任意の場所に解凍しておけば大丈夫です。
他のツールについては検索すれば詳しい導入方法が分かるので、ここでは割愛します。
次に3Dモデルを用意します。お好きなモデリングツールでアイテムにしたいモデルを作成しましょう。もちろんBlenderで作成することもできます。今回は以前作成したイストワールのモデルを使用します。モデルの用意が出来たらボーンとアニメーションを作っていきます。
2.モデルにボーンとウェイトを付ける
アニメーションを付ける方法は主に二つあります。
- 直接オブジェクトを動かして位置や回転を記録する方法
- リンクしたArmature(Skeleton 骨格)を動かしてその位置や回転を記録する方法
まずはAnimation Tools N4 - Mesh Animator内の"Dummy.blend"をBlenderで開きます。
Animation Tools N4 - Mesh Animator \ Example \ Dummy.blend ←このファイルです
開くとDummy_Modelというオブジェクトと3つのボーンで構成されたArmatureがあります。Dummy_Modelを削除してから、用意した自分のモデルを読み込みます。
※[Controller_BASE]、 [NPC Root [Root]]この二つのボーンは絶対に削除しないでください。
Dummy_Modelを削除してモデルを読み込むとこのような状態になります。
次はこのArmatureを使って自分のモデルに合うボーンを作成します。
編集モードで[NPC Root [Root]]か[Bone_01]を選択し、Eを押して新たなボーンを引っ張り出しましょう。この辺りのやり方は多くのサイトで解説されているので、詳しくはそちらをご覧ください。
最終的にはScale=1で書き出すため、ボーンとモデルはあらかじめゲーム内で表示したい大きさに合わせてください。(近似の大きさのバニラメッシュ等を読み込んで合わせるのが楽です)
ボーンを追加するとこんな感じになります。ボーンの両端にはHead(根本)とTail(先端)があり、Headを中心に回転します。各ボーンを動かしたい部分に合った位置に調整しましょう。
また、各ボーンの名前を部分に合ったものにしておくと分かり易くなります。
ポイント!
- [Controller_BASE]と[NPC Root [Root]]の二つは弄ってはいけない。(位置変更は可)
- 新規のボーンは[NPC Root [Root]]か[Bone_01]のどちらかを親にする。
- 親ボーンとの接続と継承設定は自由。
- 動かしたい部分のボーンだけ作成すればよい。(骨格全体を作る必要はない)
- あらかじめゲーム内で表示したい大きさにしておく。
ポーズモードに切り替えてボーンを選択し、動かしたいオブジェクトを選択してウェイトペイントモードで塗っていきます。
ポイント!
- 基本的にはシェーディングをワイヤーフレームにして塗る。
- 編集モードで頂点を選択してからウェイトペイントモードでマスクを付けると、選択した頂点のみに塗ることができる。
- 画面左のグラデーションツールを使えば、画像のように先端にかけて徐々にウェイトを強く塗ることができる。
- ウェイトペイントモードはボーンを動かして確認しながら塗ることができる。Gで移動、Rで回転、Sでスケール変更。
3.アニメーション作成
まず上のタブからAnimationを選択し、アニメーション用の配置に切り替えましょう。アニメーションはフレーム毎にボーンの位置を記録して作成していきます。フレームを進めてからポーズモードでボーンを動かし、Iを押すことでそのフレームにキーを挿入できます。
ポイント!
- ゲーム内ではアニメーションがループする為、開始位置と終了位置を一致させる。
- 最初に開始フレームと終了フレームで全ボーンの初期位置を記録すると楽。
完成したらデスクトップ等の分かりやすい場所に.blendファイルとして一旦保存してください。
4-1.アニメーションとモデルを出力
ここから少し難しくなります。
Mesh Animator内のスクリプトを選択し、"スクリプト実行"をクリックします。
3種類あるので3回実行する必要があります。
Animation Tools N4 - Mesh Animator \ 02. Scripts \ Script1 = Export Skeleton.txt
Animation Tools N4 - Mesh Animator \ 02. Scripts \ Script2 = Export Skin.txt
Animation Tools N4 - Mesh Animator \ 02. Scripts \ Script3 = Export Animation.txt
全て実行すると.blendファイルを保存した場所に「Weights.txt」「Skeleton.txt」「zBoneKeys.txt」の3つが生成されます。(もしくはAnimation Tools N4 - Mesh Animator \ Example \ ここにあります)
3つの.txtファイルがちゃんと生成されたことを確認したら、オブジェクトモードで全選択し、Alt+Pでペアレントを解消します。モディファイアは適用しないでください。
Armature以外のオブジェクトを全て選択し、nifでエクスポートします。
※UVマップは出力前にきちんと設定しておいてください。
※マテリアルとシェーディングの設定は適当で大丈夫です。
※オブジェクト設定は下の画像のようにしてください。
※出力設定のScaleは必ず1にしてください。
設定ができたら任意の場所にnifファイルとしてエクスポートしてください。
ポイント!
- 3種類のスクリプトを全て実行する。
- .txtファイルは.blendファイルがある場所に生成される。
- オブジェクトのArmatureモディファイアを適用しない。
- Armature以外のオブジェクトをnifでエクスポート。(Armatureを非表示にして全選択すると楽)
- 出力時のScaleは必ず1にする。
- 出力時にエラーが出る場合はSkryim MOD作成 Wikiを参照。
4-2.NifSkopeで編集
ここからはNifSkopeを使います。Blenderは一旦閉じても構いません。
出力した自分のnifファイルとMesh Animator内の"Dummy.nif"の二つをNifSkopeで開きます。
Animation Tools N4 - Mesh Animator \ Example \ Dummy.nif ←このファイル
Dummy.nifを開くとDummy_modelというオブジェクトがあります。このオブジェクト(NiTriShape)を選択してCtrl+Cでコピーします。
一つ上の階層のNiNodeを選択してCtrl+Pで貼り付けます。出力した自分のnif内にあるオブジェクトの数だけコピーしてください。
※オブジェクトが一つしかない場合はこのコピーする作業は不要です。
今回のモデルは5つのオブジェクトで構成されているため、4回コピーしてNiTriShapeを5つに増やしました。
出力したnifを見ながらNiTriShapeの名前を変更します。(Dummy_model→自分のオブジェクト名)
※これはBlender内で決めたオブジェクト名と同じである必要があります。
※順番を合わせた方が後の作業が分かりやすくなります。
次は出力したnifに移り、一番上のNiNodeをコピーします。
(場合によっては一番上がBSFadeNodeのことがありますが、同じようにコピーしてください)
Dummy.nifに戻り、一番上のBSFadeNodeを選択してCtrl+Vで貼り付けます。
コピーしたNiNode(もしくはBSFadeNode)を開き、さらにNiTriShapeを開くとNiTriShapeDataがあります。
オブジェクトが複数ある場合は画像のように全て展開しておきましょう。
先ほど名前を変更したNiTriShape(元Dummy_model)を選択し、Block Detailsの下の方にあるDataの行をダブルクリックします。
コピーしてきた自分のNiTriShapeDataの左側に書いてある数字を入力します。
すると自分のNiTriShapeDataがリンクされます。オブジェクトが複数ある場合は、別の名前のNiTriShapeにリンクしないように気を付けてください。
先ほど名前を変更したNiTriShape(元Dummy_model)を選択し、Block Detailsの下の方にあるDataの行をダブルクリックします。
コピーしてきた自分のNiTriShapeDataの左側に書いてある数字を入力します。
すると自分のNiTriShapeDataがリンクされます。オブジェクトが複数ある場合は、別の名前のNiTriShapeにリンクしないように気を付けてください。
全てのオブジェクトがリンク出来たら、コピーしてきたNiNodeと余り出たNiTriShapeDataを全て削除します。間違ってSkeletonのNiNodeを削除しないように気を付けてください。
上書きしても構わないのですが、別の場所に新規に保存した方がやり直す際に便利です。
ポイント!
- Dummy.nifを開き、出力したオブジェクトの数だけDummy_modelのNiTriShapeをコピーする。
- NiTriShapeの名前をDummy_modelから自分のオブジェクトの名前に変更する。
- NiTriShapeの名前はBlenderで決めたオブジェクト名と同一である必要がある。
- 変更した名前に合ったNiTriShapeDataをリンクさせる。
4-3.BodyAnimator
Blenderのスクリプトで生成された、「Weights.txt」「Skeleton.txt」「zBoneKeys.txt」の3つと先ほど保存したDummy.nifをMesh Animator内のBodyAnimator.exeがあるフォルダにコピーします。
Animation Tools N4 - Mesh Animator \ 01. Tools \ BodyAnimator.exe ←このフォルダ
因数を渡して起動するため、BodyAnimator.exeのショートカットを同じフォルダ内に作ります。
ショートカットのプロパティを開き、リンク先の一番後ろに
Dummy.nif Skeleton.txt Weights.txt zBoneKeys.txtを付け足し、OKを押して閉じてください。
※半角スペースを忘れないように気を付けてください。ショートカットのプロパティを開き、リンク先の一番後ろに
Dummy.nif Skeleton.txt Weights.txt zBoneKeys.txtを付け足し、OKを押して閉じてください。
例)\Animation Tools N4 - Mesh Animator\01. Tools\BodyAnimator.exe" Dummy.nif Skeleton.txt Weights.txt zBoneKeys.txt
ショートカットをダブルクリックするとコマンドプロンプトが起動します。
ミスが無ければ画像のように黄色い文字でPROCESS COMPLETEと表示されます。
同じフォルダにDummy_new.nifが生成されるので、コマンドプロンプトを閉じてから確認しましょう。
ポイント!
- 実行フォルダ内にBlenderのスクリプトで生成された3つの.txtファイルを置く。
- 実行フォルダ内に編集後のDummy.nifを置く。
- Dummy.nif内のNiTriShapeの名前をBlender内のオブジェクト名と統一する。
- Dummy.nif内にSkeletonという名前の空のNiNodeがあることを確認する。
- BodyAnimator.exeのショートカットに因数を渡して起動する。
Dummy_new.nifを開くと新たにNiControllerManagerと空だったSkeletonのNiNodeにBlenderで作ったボーンが追加されています。
次の作業をする前に一旦セーブしてください。
するとNifSkopeによってノードがリソートされ、NiControllerManagerが上になります。
※これをしないとゲームやCKがCTDします。
※Dummy_new.nifは任意の名前に変更しておきましょう。
再生ボタンを押して正しく動いていることが確認出来たら、コリジョンの作成に移りましょう。
※出来ればこのままCKかゲーム内で動作確認しておいた方が良いと思います。
※まだespを作成していない場合はnifの名前を変更し、適当なアイテムに上書きして確認しましょう。
次はコリジョンを作成します。
コリジョンとはゲーム内での当たり判定のことです。
スカイリムでは物理エンジンの挙動にも影響を与えます。
Blenderでコリジョン用のnifを作成します。
保存した.blendファイルを開くか、出力したnifファイルを読み込んでください。
コリジョンはある程度形が合っていれば問題ないので、モデル全体を囲むように作りましょう。
今回は小さなアイテムなので、円錐で囲う程度で十分です。
大きなアイテムの場合は元のモデルの形を維持すると、当たり判定が正確になります。
"ポリゴン数削減"モディファイアで大体の形が残る程度に頂点数を減らしましょう。
オブジェクトが複数ある場合はオブジェクトモードで全選択してからCtrl+Jで結合し、重複頂点を削除してから、ポリゴン数削減を実行してください。
完成したらコリジョン用のモデルのみを選択しnifとして別名で出力しましょう。
オブジェクト、シェーディング、マテリアル等の設定は適当で大丈夫です。
出力時のScaleは必ず1にしてください。
正しく出力できたことを確認したら、ChunkMergeを起動してください。
初めて起動するとnif.xmlの場所を聞かれます。これはNifSkope.exeがあるフォルダ内にあります。
次にコリジョンのテンプレートになるnifを指定するのですが、自作するかこちらをダウンロードして使ってください。解凍してChunkMergeフォルダ内等の分かりやすい場所に配置すれば大丈夫です。
最後はTESV.exeの場所を聞かれるので指定します。
使い方は簡単です。まずコリジョンを付けたいnifとコリジョン用nifを指定します。
Collision Materialから任意のマテリアルを選択します。
Convertをクリックして、結合します。
※自動で上書き保存されるため念のためバックアップを取っておいてください。
実行すると、元のnifにbhkCollisionObjectというノードが追加されます。
ポイント!
Collision Materialから任意のマテリアルを選択します。
Convertをクリックして、結合します。
※自動で上書き保存されるため念のためバックアップを取っておいてください。
実行すると、元のnifにbhkCollisionObjectというノードが追加されます。
ポイント!
- コリジョン用モデルは元のモデルを囲う程度のシンプルなもので良い。
- 出力時のScaleは必ず1にする。
- 出力時にエラーが出る場合はSkryim MOD作成 Wikiを参照。
- 上書き保存されるため、バックアップを取っておく。
6.NifSokpeで仕上げる
まずは物理エンジンの挙動を真似たいアイテムを決めて、そのnifをNifSkopeで開きます。
先ほどChunkMergeでコンバートしたnifを開きbhkCollisionObjectノードを展開すると、bhkRigidBodyTというノードがあります。
真似たいnifのbhkRigidBodyT(バニラはbhkRigidBody)のBlock Detailsを見ながら、自分のnifの数値を書き換えます。
※Translationの値は0のままにしておいてください。
先ほどChunkMergeでコンバートしたnifを開きbhkCollisionObjectノードを展開すると、bhkRigidBodyTというノードがあります。
真似たいnifのbhkRigidBodyT(バニラはbhkRigidBody)のBlock Detailsを見ながら、自分のnifの数値を書き換えます。
※Translationの値は0のままにしておいてください。
数値の他にOL_STATICやMO_QUAL_INVALID等もダブルクリックすると出てくるプルダウンリストから選択して、真似たいnifに合わせてください。
次にBSXFlagsを選択し、Block Detailsの旗マークからメニューを開き、Enable HavokとEnable Collisionにチェックを入れてください。Acceptを押してメニューを閉じます。
NiStringExtraDataは不要なので削除します。
NiTriShapeに付いているNiAlphaPropertyも透過が不要の場合は削除します。
最後にBSLightingShaderPropertyとBSShaderTextureSetを任意のデータに書き換えます。
保存したらゲーム内で挙動を確認し、問題なければ完成です。
お疲れ様でした。
※このNiControllerManagerを使った場合はインベントリ内ではアニメーションしません。
※捨てるなどしてワールドに配置するとアニメーションします。
今回の完成品はこちらです。
インベントリ内でもアニメーションさせたい場合は以下をご覧ください。
インベントリ内でもアニメーションするようになりますが、ボーンが多いと結構面倒です。
加えてインベントリ内で表示位置がずれることがある為、特に理由が無ければ行う必要はありません。
先に作業内容をまとめると
NiMultiTargetTransformControllerによって制御されている複数のアニメーションを、それぞれのボーンにNiTransformControllerを付け、アニメーションを直接リンクさせます。
次にBSXFlagsを選択し、Block Detailsの旗マークからメニューを開き、Enable HavokとEnable Collisionにチェックを入れてください。Acceptを押してメニューを閉じます。
NiStringExtraDataは不要なので削除します。
NiTriShapeに付いているNiAlphaPropertyも透過が不要の場合は削除します。
最後にBSLightingShaderPropertyとBSShaderTextureSetを任意のデータに書き換えます。
保存したらゲーム内で挙動を確認し、問題なければ完成です。
お疲れ様でした。
※このNiControllerManagerを使った場合はインベントリ内ではアニメーションしません。
※捨てるなどしてワールドに配置するとアニメーションします。
今回の完成品はこちらです。
インベントリ内でもアニメーションさせたい場合は以下をご覧ください。
番外編.インベントリ内でもアニメーションさせる方法
インベントリ内でもアニメーションするようになりますが、ボーンが多いと結構面倒です。
加えてインベントリ内で表示位置がずれることがある為、特に理由が無ければ行う必要はありません。
先に作業内容をまとめると
NiMultiTargetTransformControllerによって制御されている複数のアニメーションを、それぞれのボーンにNiTransformControllerを付け、アニメーションを直接リンクさせます。
適当なノードで右クリックし、Block > Insertをクリックします。
NiT...からNiTransformControllerをクリックします。
挿入されたNiTransformControllerを選択し、Ctrl+Cでコピーします。
Skeletonのノードを展開し、画像のようにNPC Root [Root]を含めたすべてのボーンに貼り付けます。
NiTransformControllerのBlock DetailsのInterpolatorがNoneになっているので、
NiControllerManager > NiControllerSequence > NiTransformInterpolatorの左の数字を入力します。
NiTransformInterpolatorはボーンの数だけ存在し、それぞれのボーンに一つずつ対応しています。
正しい組み合わせでリンクさせないと正常にアニメーションしません。
基本的にはボーンの並び通りに上から順に対応しています。
NPC Root > 次の階層の上から順 > 更に次の階層の上から順といった並びになっています。
画像のように全てのNiTransformControllerにInterpolatorが付いたら、NiControllerManagerのノードを丸ごと削除します。
最初に挿入したNiTransformControllerと余り出たNiMultiTransformControllerも削除します。
最後にBSXFragsのEnable CollisionとEnable Animationにチェックを入れてAcceptを押します。
これで保存すればインベントリ内でもアニメーションするようになります。