DZeZl_9VwAAwVo7

今回はアニメーション付きアイテムの作成方法を紹介します。

アニメーション付きアイテムとは"センチュリオンのダイナモ・コア""蝶入りの瓶"のような、動くアイテムのことです。日本語での詳しい解説がまだ無いようなので、今回はその作成方法を紹介します。

因みに今回の完成品はこちらです。


 必要なツール


 手順
  1. 事前準備とモデルの作成
  2. Blenderでモデルにボーンとウェイトを付ける
  3. アニメーションを作成
  4. Mesh Animatorでアニメーション付きnifを作成
    4-1.アニメーションとモデルを出力
    4-2.NifSkopeで編集
    4-3.BodyAnimatorで統合
  5. ChunkMergeでコリジョンを作成
  6. NifSkopeで仕上げる
    番外編. インベントリ内でアニメーションさせる


1.事前準備


先に必要なツールをインストールしておきましょう。ToolsPack to work with Blender 2.7の中には複数のツールが入っていますが、今回使用するのは「Animation Tools N4 - Mesh Animator」のみです。これは任意の場所に解凍しておけば大丈夫です。

他のツールについては検索すれば詳しい導入方法が分かるので、ここでは割愛します。

次に3Dモデルを用意します。お好きなモデリングツールでアイテムにしたいモデルを作成しましょう。もちろんBlenderで作成することもできます。今回は以前作成したイストワールのモデルを使用します。モデルの用意が出来たらボーンとアニメーションを作っていきます。


2.モデルにボーンとウェイトを付ける


アニメーションを付ける方法は主に二つあります。
  1. 直接オブジェクトを動かして位置や回転を記録する方法
  2. リンクしたArmature(Skeleton 骨格)を動かしてその位置や回転を記録する方法
今回は2の方法を紹介します。2の方法はボーンの作成やウェイトペイントが必要なので面倒に思うかも知れませんが、その後のアニメーション作成が断然に楽になりますし、1の方法ではできない事が沢山あります。例えば体と手足が同一のオブジェクトの場合、1では手足のみを動かすことはできませんが、2では手足にそれぞれのボーンを付ける事で別々の動きを可能とします。また、ウェイトの付け方次第では指先や髪の毛先などの細かい動きも実現可能です。
 

まずは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を削除してモデルを読み込むとこのような状態になります。
blender001

次はこのArmatureを使って自分のモデルに合うボーンを作成します。
編集モードで[NPC Root [Root]]か[Bone_01]を選択し、Eを押して新たなボーンを引っ張り出しましょう。この辺りのやり方は多くのサイトで解説されているので、詳しくはそちらをご覧ください。

最終的にはScale=1で書き出すため、ボーンとモデルはあらかじめゲーム内で表示したい大きさに合わせてください。(近似の大きさのバニラメッシュ等を読み込んで合わせるのが楽です)

blender002
ボーンを追加するとこんな感じになります。ボーンの両端にはHead(根本)とTail(先端)があり、Headを中心に回転します。各ボーンを動かしたい部分に合った位置に調整しましょう。

また、各ボーンの名前を部分に合ったものにしておくと分かり易くなります。

 ポイント!

  • [Controller_BASE]と[NPC Root [Root]]の二つは弄ってはいけない。(位置変更は可)
  • 新規のボーンは[NPC Root [Root]]か[Bone_01]のどちらかを親にする。
  • 親ボーンとの接続と継承設定は自由。
  • 動かしたい部分のボーンだけ作成すればよい。(骨格全体を作る必要はない)
  • あらかじめゲーム内で表示したい大きさにしておく。


ボーンが出来たら次はウェイトを塗っていきます。オブジェクトモードでボーンを選択し、Aを2回押して全オブジェクトを選択します。Ctrl+Pでアーマチュア変形を選び、ペアレント対象に設定します。
blender005

ポーズモードに切り替えてボーンを選択し、動かしたいオブジェクトを選択してウェイトペイントモードで塗っていきます。
blender003

 ポイント!

  • 基本的にはシェーディングをワイヤーフレームにして塗る。
  • 編集モードで頂点を選択してからウェイトペイントモードでマスクを付けると、選択した頂点のみに塗ることができる。
  • 画面左のグラデーションツールを使えば、画像のように先端にかけて徐々にウェイトを強く塗ることができる。
  • ウェイトペイントモードはボーンを動かして確認しながら塗ることができる。Gで移動、Rで回転、Sでスケール変更。
ウェイトの修正はアニメーションが完成してからでも可能なので、微調整は後でも大丈夫です。大体塗り終えたらアニメーション作成に移りましょう。


3.アニメーション作成


 まず上のタブからAnimationを選択し、アニメーション用の配置に切り替えましょう。
blender004b

アニメーションはフレーム毎にボーンの位置を記録して作成していきます。フレームを進めてからポーズモードでボーンを動かし、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

blender006b

全て実行すると.blendファイルを保存した場所に「Weights.txt」「Skeleton.txt」「zBoneKeys.txt」の3つが生成されます。(もしくはAnimation Tools N4 - Mesh Animator \ Example \ ここにあります

3つの.txtファイルがちゃんと生成されたことを確認したら、オブジェクトモードで全選択し、Alt+Pでペアレントを解消します。
モディファイアは適用しないでください。

Armature以外のオブジェクトを全て選択し、nifでエクスポートします。


※UVマップは出力前にきちんと設定しておいてください。

※マテリアルとシェーディングの設定は適当で大丈夫です。
※オブジェクト設定は下の画像のようにしてください。
※出力設定のScaleは必ず1にしてください。
blender007
設定ができたら任意の場所に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内にあるオブジェクトの数だけコピーしてください。
        ※オブジェクトが一つしかない場合はこのコピーする作業は不要です。
        blender008
        blender009
        今回のモデルは5つのオブジェクトで構成されているため、4回コピーしてNiTriShapeを5つに増やしました。

        出力したnifを見ながらNiTriShapeの名前を変更します。(Dummy_model→自分のオブジェクト名)
        ※これはBlender内で決めたオブジェクト名と同じである必要があります。
        ※順番を合わせた方が後の作業が分かりやすくなります。
        blender011

        次は出力したnifに移り、一番上のNiNodeをコピーします。
        (場合によっては一番上がBSFadeNodeのことがありますが、同じようにコピーしてください)
        blender010

        Dummy.nifに戻り、一番上の
        BSFadeNodeを選択してCtrl+Vで貼り付けます。
        blender012
        コピーしたNiNode(もしくはBSFadeNode)を開き、さらにNiTriShapeを開くとNiTriShapeDataがあります。
        オブジェクトが複数ある場合は画像のように全て展開しておきましょう。

        先ほど名前を変更したNiTriShape(元Dummy_model)を選択し、Block Detailsの下の方にあるDataの行をダブルクリックします。

        コピーしてきた自分のNiTriShapeDataの左側に書いてある数字を入力します。
        すると自分の
        NiTriShapeDataがリンクされます。オブジェクトが複数ある場合は、別の名前のNiTriShapeにリンクしないように気を付けてください。


        全てのオブジェクトがリンク出来たら、コピーしてきたNiNodeと余り出たNiTriShapeDataを全て削除します。間違ってSkeletonのNiNodeを削除しないように気を付けてください。
        blender013
        blender014

        不要なものを削除して画像のようになったらDummy.nifを保存します。
        上書きしても構わないのですが、別の場所に新規に保存した方がやり直す際に便利です。

         ポイント!
        • 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 ←このフォルダ

        blender015
        因数を渡して起動するため、BodyAnimator.exeのショートカットを同じフォルダ内に作ります。

        ショートカットのプロパティを開き、リンク先の一番後ろに

         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


        blender016
        ショートカットをダブルクリックするとコマンドプロンプトが起動します。
        ミスが無ければ画像のように黄色い文字で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は任意の名前に変更しておきましょう。
        blender019

        再生ボタンを押して正しく動いていることが確認出来たら、コリジョンの作成に移りましょう。
        ※出来ればこのままCKかゲーム内で動作確認しておいた方が良いと思います。
        ※まだespを作成していない場合は
        nifの名前を変更し、適当なアイテムに上書きして確認しましょう。

        ※このNiControllerManagerを使った場合はインベントリ内ではアニメーションしません。
        ※捨てるなどしてワールドに配置するとアニメーションします。
        ※インベントリ内でもアニメーションさせたい場合は番外編をご覧ください。


        5.コリジョン作成

        次はコリジョンを作成します。
        コリジョンとはゲーム内での当たり判定のことです。
        スカイリムでは物理エンジンの挙動にも影響を与えます。

        Blenderでコリジョン用のnifを作成します。
        保存した.blendファイルを開くか、出力したnifファイルを読み込んでください。

        コリジョンはある程度形が合っていれば問題ないので、モデル全体を囲むように作りましょう。

        今回は小さなアイテムなので、円錐で囲う程度で十分です。
        blender022

        大きなアイテムの場合は元のモデルの形を維持すると、当たり判定が正確になります。
        "ポリゴン数削減"モディファイアで大体の形が残る程度に頂点数を減らしましょう。
        blender021
        オブジェクトが複数ある場合はオブジェクトモードで全選択してからCtrl+Jで結合し、重複頂点を削除してから、ポリゴン数削減を実行してください。

        完成したらコリジョン用のモデルのみを選択しnifとして別名で出力しましょう。
        オブジェクト、シェーディング、マテリアル等の設定は適当で大丈夫です。
        出力時のScaleは必ず1にしてください。
        blender023

        正しく出力できたことを確認したら、
        ChunkMergeを起動してください。

        初めて起動するとnif.xmlの場所を聞かれます。これはNifSkope.exeがあるフォルダ内にあります。

        次にコリジョンのテンプレートになるnifを指定するのですが、自作するかこちらをダウンロードして使ってください。解凍してChunkMergeフォルダ内等の分かりやすい場所に配置すれば大丈夫です。

        最後はTESV.exeの場所を聞かれるので指定します。
        blender020
        使い方は簡単です。まずコリジョンを付けたいnifとコリジョン用nifを指定します。
        Collision Materialから任意のマテリアルを選択します。
        Convertをクリックして、結合します。
        ※自動で上書き保存されるため念のためバックアップを取っておいてください。

        実行すると、元のnifにbhkCollisionObjectというノードが追加されます。
        blender024

         ポイント!
        • コリジョン用モデルは元のモデルを囲う程度のシンプルなもので良い。
        • 出力時のScaleは必ず1にする。
        • 出力時にエラーが出る場合はSkryim MOD作成 Wikiを参照。
        • 上書き保存されるため、バックアップを取っておく。


        6.NifSokpeで仕上げる

        まずは物理エンジンの挙動を真似たいアイテムを決めて、そのnifをNifSkopeで開きます。

        先ほどChunkMergeでコンバートしたnifを開きbhkCollisionObjectノードを展開すると、bhkRigidBodyTというノードがあります。
        真似たいnifのbhkRigidBodyT(バニラはbhkRigidBody)のBlock Detailsを見ながら、自分のnifの数値を書き換えます。
        ※Translationの値は0のままにしておいてください。
        blender017
        数値の他にOL_STATICやMO_QUAL_INVALID等もダブルクリックすると出てくるプルダウンリストから選択して、真似たいnifに合わせてください。

        次にBSXFlagsを選択し、Block Detailsの旗マークからメニューを開き、Enable HavokEnable Collisionにチェックを入れてください。Acceptを押してメニューを閉じます。
        blender018

        NiStringExtraDataは不要なので削除します。

        NiTriShapeに付いているNiAlphaPropertyも透過が不要の場合は削除します。

        最後にBSLightingShaderPropertyとBSShaderTextureSetを任意のデータに書き換えます。


        保存したらゲーム内で挙動を確認し、問題なければ完成です。
        お疲れ様でした。

        ※このNiControllerManagerを使った場合はインベントリ内ではアニメーションしません。
        ※捨てるなどしてワールドに配置するとアニメーションします。

        今回の完成品はこちらです。


        インベントリ内でもアニメーションさせたい場合は以下をご覧ください。


        番外編.インベントリ内でもアニメーションさせる方法


        インベントリ内でもアニメーションするようになりますが、ボーンが多いと結構面倒です。
        加えてインベントリ内で表示位置がずれることがある為、特に理由が無ければ行う必要はありません。

        先に作業内容をまとめると
        NiMultiTargetTransformControllerによって制御されている複数のアニメーションを、それぞれのボーンに
        NiTransformControllerを付け、アニメーションを直接リンクさせます。

        適当なノードで右クリックし、Block > Insertをクリックします。
        blender026

        NiT...からNiTransformControllerをクリックします。
        blender027

        挿入された
        NiTransformControllerを選択し、Ctrl+Cでコピーします。
        Skeletonのノードを展開し、画像のようにNPC Root [Root]を含めたすべてのボーンに貼り付けます。
        blender028

        NiTransformControllerのBlock DetailsのInterpolatorがNoneになっているので、
        NiControllerManager > NiControllerSequence > NiTransformInterpolatorの左の数字を入力します。
        blender029
        NiTransformInterpolatorはボーンの数だけ存在し、それぞれのボーンに一つずつ対応しています。
        正しい組み合わせでリンクさせないと正常にアニメーションしません。
        基本的にはボーンの並び通りに上から順に対応しています。
        NPC Root > 次の階層の上から順 > 更に次の階層の上から順といった並びになっています。

        blender030
        画像のように全てのNiTransformControllerにInterpolatorが付いたら、NiControllerManagerのノードを丸ごと削除します。
        最初に挿入したNiTransformControllerと余り出たNiMultiTransformControllerも削除します。

        最後にBSXFragsのEnable CollisionとEnable Animationにチェックを入れてAcceptを押します。
        blender031

        これで保存すればインベントリ内でもアニメーションするようになります。