2014年6月18日水曜日

アニメーション付メッシュをBlenderでExport, UnityでImport

アニメーションを付与したメッシュをBlenderでExport、UnityでImportする際のメモ。

目的

非人型形状のメッシュモデルをアニメーション駆動する。
(多間接な有機物や無機物等)




使用環境

Windows7x64
Unity 4.3.4.f1
Blender2.70a




Unityでインポートできる形式

ユーザーズマニュアルによると、
  • Maya(.mb、.ma)
  • Cinema 4D(.c4d)
  • Autodesk(.fbx)
などとある。
.bvh形式はUnityにドラッグ&ドロップにて読み込みはできたが、実際利用可能なのかは未確認。




メッシュモデルとアニメーションの作成

Blenderで作成。
Blender上でのモデルとアニメーションの作成方法については割愛。

サンプル用に簡単なドアのモデルを作成。
アニメーションはOpenとCloseの2つを作成。




メッシュとアニメーションのエクスポート

人型の場合はアニメーションを使いまわす可能性があるのでメッシュモデルから分離しておく方が有利なこともある。

非人型の有機物/無機物等の、あまりアニメーションの可搬性がない(そのメッシュ専用のアニメーション)モデルを今回は想定するので分離しないほうが都合が良さそうと考える。

今回はメッシュと複数アニメーションを同梱できる.fbx形式でExportした。
※ちなみにCollada形式では1つのアニメーションしか付与できなかった。
  1. Objectを選択状態にする。
  2. File > Export >  Autodesk FBX (.fbx)
  3. 各欄を設定してExport(Door.fbx とした)
    1. Selected Objects:
      選択したObjectのみをExport対象とする。
    2. Scale: 1.00
      サイズの整合はUnityのインポーター側で行うことにする。
    3. Forward: -Z Forward
      BlenderとUnityでのZ軸方向の違いを補正。
    4. Up: Y Up
      BlenderとUnityでのY軸方向の違いを補正。
    5. Armature/Mesh:
      メッシュとArmatureをExport対象に含める。(ArmatureはObjectとAnimationの関連付けに必要)
    6. Include Animation:
      アニメーションをExportに含める。




.blendファイルをUnityのAssetに置かない私的理由

今回のサンプルでは行っていないが、実際の作業ではノーマルマップを生成する都合上、ハイポリゴンモデルとローポリゴンモデルが1つの.blendファイルに含んでいる場合がある。
(作業上Bakeが楽な為)

この.blend ファイルをUnityのAssetに配置すると、ローポリモデルだけでなくハイポリモデルもUnityは読み込んでしまう。
これがうっとおしいので.fbxでエクスポート/インポートを試してみた。




Unityでfbxファイルをインポート

BlenderでExportした Door.fbx をUnityのAssetsにドラッグ&ドロップする。

アニメーション確認

アニメーション(Open/Close)もきちんとインポートされており、Inspector上で個々のアニメーション動作の確認ができる。



モデルサイズの整合性

しかしこのままではモデルの大きさが整合せず、非常に小さいサイズになってしまう。

Inspector内の Model > Scale Factor の値がデフォルトでは 0.01 となっている。
これを 0.5に修正して、Applyをクリックする。
これでBlender上での1.0単位とUnity上での1.0単位が整合する。
※BlenderからExportする際のScale値にも関係する。上記はそのScale値を 1.00 としている場合。
※追記:Blender側のObject自体のScale値も1.0に固定したほうが何かと良い。参考記事→「
Blenderでモデリング時のTransform Scale


アニメーションの設定

Inspector内の Rig > Animation Type をLegacyに変更してApply。
※Blenderで作成したアニメーションはLegacyに設定しないとダメらしい?。インポート時UnityのConsoleにてLegacyに設定しろとログが流れる。

これによりHierarchyにドラッグ&ドロップした際に自動的に Animationコンポーネントが追加された状態になる。
なお且つAnimationコンポーネントのAnimations欄に全アニメーションがElementsに自動登録されている。


※ちなみにテクスチャは別途Unityにドラッグ&ドロップして、手動で貼り付ける。
先にテクスチャを/Resource/Assets/Texture配下にインポートしてからfbxファイルをインポートすると自動的に貼ってくれたりする。
この辺は自動認識で貼らせる規則性等がUnityにはある様子なので利用すると少し楽ができる。




シーンにドアを配置

シーンにDoorを配置する。

この状態で Play実行すると Play Automatically に設定されているアニメーションが(スクリプトが無くても)自動起動する。







スクリプトからアニメーションを駆動

準備

スクリプトからのみアニメーションを制御するようにしてみる。
先のPlay実行時のアニメーション自動実行を止める為、Animation欄の Play Automaticallyのチェックをはずす。

スクリプト(C#)


関数 animation.Play() を使う。引数にアニメーション名を渡すだけ。


using UnityEngine;
using System.Collections;

public class DoorTest : MonoBehaviour {

    void Start () {
        animation.Play("Open");
    }
}

サンプル






上記サンプルプロジェクト保管庫(GitHub)
https://github.com/maruton/Sample_AramtureDoor

サイト右列下方の「Download ZIP」からダウンロード可能。
※Unity5化済み。




感想など

.fbx形式便利です。 (一応世間ではデファクトスタンダード?)

なんとなく過去のしがらみ(?)の都合上ColladaでExportすることが多かったのですが、複数アニメーションに関してはColladaではうまくいかず。
やはり.fbx形式を使うべきなのか。

ハイポリ/ローポリを.blendファイルに共存させる必要がなければ、.blendファイルをAssetsに放り込んでしまえばもっと楽かもしれない。

人型アバターのアニメーションが例としては多いが、無機物などでも結構使い道はあるかも?

※過去に別プラットフォームにて多段間接をクォータニング計算でスクリプト駆動したことがありますが、計算が面倒&誤差がでると目もあてられないので、アニメーションで実装は楽で良いと思います。

0 件のコメント:

コメントを投稿