裏鍵.dump

自分用備忘録。内容に脈絡を求めてはいけない。

MagicaVoxel→Blender→Unityでボクセルモデルを動かす 改②

ボクセルモデルに自動ウェイト機能を使って楽をしたい、の2回目。

 

前回は、MagicaVoxelからエクスポートしたモデルで自動ウェイト機能が使えずどうしよう、というところまで進んだ。

 

MagicaVoxel内ではデータを格子状で持っているはずなのに、obj形式で出力するときに最適化してくれているようだ。

それはそれでありがたい機能なのだけど、今やりたいことに対してはちょっと困ってしまう。

 

・MagicaVoxelから別の形式でエクスポートしてみる

MagicaVoxelがエクスポートできる形式はobjだけではない。

他の形式でエクスポートすればなんとかならないだろうか。

f:id:cores0316:20160729011022p:plain

というわけで、この中からply(ply Mesh)というのを選んでみた。

Wikipediaに説明がある。

PLY (file format) - Wikipedia, the free encyclopedia

 

 エクスポートしたファイルをテキストエディタで開いてみた。

f:id:cores0316:20160729015318p:plain

なんと各頂点の座標に加えて色の情報も持っている。

確かにエクスポートしたファイルは1つだけでpngファイルが無かった。

 

Blenderにお試しインポート

Blenderを起動して、plyファイルをインポートしてみる。

f:id:cores0316:20160729020455p:plain

スケールを整えてWireframeで表示してみる。

f:id:cores0316:20160729021506p:plain

お、元のボクセル通りのメッシュになっている。これはいけそうだ。

 

・ボクセルモデルを差し替える

また最初からやり直すのも大変なので、以前アニメーションまで作成したファイルを読み込んで、ボクセルモデルだけ差し替えてみよう。

 

Pose Modeで全部のボーンを選択し、下のメニューからPose→Clear Transform→Rotationを選択して、アニメーションの回転情報を初期化する。

f:id:cores0316:20160729024921p:plain

初期のポーズに戻ればOK。

f:id:cores0316:20160729025439p:plain

 

 

次に、ボクセルモデルとArmatureの関連付けを外す。

Object Modeでボクセルモデルを選択して、右のレンチアイコンをクリックしてその下の赤枠「×」ボタンを押す。

f:id:cores0316:20160729031130p:plain

Pose Modeでボーンを動かしてもモデルは動かなくなったはず。

f:id:cores0316:20160729032123p:plain

 

ここまでできたら、ボクセルモデルを選択してDeleteキーを押す。確認のポップアップが出るのでDeleteを選択する。ボーンだけが残る。

f:id:cores0316:20160729032344p:plain

 

plyファイルを読み込んで、Sキーを押して0.1と入力してスケールをあわせる。

同じに見えるけどメッシュの形は前回と全く異なる。

f:id:cores0316:20160729033156p:plain

 

 

さて、前回の操作を実行して自動ウェイト機能を使用・・・といきたいところだけど、その前に不要な頂点を削除する。

設定にもよると思うが、画面の右上に現在読み込んだモデルの情報が出ている。

このモデルは頂点数が9136個となっている。

f:id:cores0316:20160729033542p:plain

前回まで読み込んでいたモデルとメッシュが異なるとはいえ、4倍強ほどの数だ。

ply形式は1つのポリゴンを構成する4つの点をポリゴン毎に別々で持っているため、今回のような格子状メッシュだと1つの頂点が大体4回くらい使われることになるからだろうと思う。

重複する頂点は削除しよう。

【2020/04/24追記】
Blender2.8では重複頂点削除の機能自体が大きく変わったので、以下と同様の名前で探しても見つからない。詳細はこちらの記事で。

urkgdmp.hatenadiary.jp

 

Object Modeでボクセルモデルを選択してEdit Modeに切り替える。

全部頂点を選択した状態(全身がオレンジになる。なっていなければAキーを2度押し)で、下のメニューからMesh→Vertices→Remove Doublesを選択する。

f:id:cores0316:20160729034814p:plain

見た目は変わらず、右上の方に削除した情報が表示される。

f:id:cores0316:20160729035252p:plain

6854個の頂点が削除されて、2282個になった。

大体前回のモデルと同じくらいになった。

 

 

・自動ウェイト機能を使用する

準備ができたので、前回記載した方法を実行してみよう。

f:id:cores0316:20160729035607p:plain

 

エラーメッセージが出力されることもなく完了した。

早速Weight Paintに切り替えてみる。

f:id:cores0316:20160729035924p:plain

 

おお、人の手では難しそうな綺麗なグラデーションで塗られている。

ただ、よく見ると頭だけを動かしたいときに肩も少し動いてしまいそう。

このように完全に思い通りにはならないところも出てくるので、そのときは手で修正することになる。こればかりは仕方が無いが、やり方はわかる。前回までの苦労は無駄ではなかったのだ。

 

自分の場合は、肩が頭の半分くらいまで動くようになってしまっていたので修正した。

そもそも、こうならないようなモデリングやボーンを作る技術というものも必要になりそうだ。

f:id:cores0316:20160729042245p:plain

 

ボーン自体は変わらないので、以前作成したアニメーションをそのまま適用できる。

f:id:cores0316:20160729045933g:plain

以前作ったものよりも、メッシュが均等で綺麗に動いてくれるのが嬉しい。

 

 

Unityへの取り込み以降は前と同じだろうと思っていたら、データの持ち方が違うためかエラーが出てしまったので、次回はその辺を調べてみる。

MagicaVoxel→Blender→Unityでボクセルモデルを動かす 改①

以前あげた下記の記事

urkgdmp.hatenadiary.jpのウェイトを塗るところで、

※ここから先の話が面倒な人は、「Armature Deform With Automatic Weights」でググると幸せになるかもしれない

と書いていたのだけど、それだけではあんまりな気がしたのでちょっと調べてみたら今まで苦労して書いてきた記事よりも良い結果になるところもわかってウワァァァァァ

 

そんなわけで、もうちっとだけ続くんじゃ・・・。

あ、今回からBlenderのバージョンを2.74から2.77にあげてます。

 2016/07/29追記:現行最新バージョンのUnityでblendファイル取り込みに失敗するため戻しました。

 

 

「Armature Deform With Automatic Weights」とは何のことなのかというのをまず説明したい。

以前の記事の③まで進めた状態(モデルを見ながらボーンを作ったところまで)で、Object Modeでモデルを選択する。

f:id:cores0316:20160728095944p:plain

次にSHIFTキーを押しながらボーンを選択する。この順に選択しないといけない。

f:id:cores0316:20160728100050p:plain

その状態で、Ctrl + Pキーを押すと、「Set Parent To」というメニューが出てくる。

f:id:cores0316:20160728100215p:plain

その中にある「With Automatic Weights」のことを指している。

インデントがついており、「Armature Deform」のオプション扱いのようなぱっと見ちょっとわかりにくいメニューになっている。

 

これを選択することで、あの気の遠くなるような塗り塗りをする必要なく自動でウェイトをつけてくれるという素敵機能を利用することができる。

ただし、どんなモデルでも自動でやってくれるわけではなく、

・メッシュがある程度対象的な形になっていること

・形状が破綻(突き抜けたり裏面が表に出てたり)が無いこと

・ボーンが全てメッシュの内側にあること

などなど、いろんな条件があるらしい。

 

そして、残念なことに上のモデルではエラーが発生して利用できなかった。

右上にエラーメッセージが表示されている。

f:id:cores0316:20160728102006p:plain

 

メッシュの形を見てみると全く対象ではないので、そりゃ自動で判断なんて無理だよね。

f:id:cores0316:20160728103623p:plain

 

さて、どうしたものか。

というところで次回へ続く。

MagicaVoxel→Blender→Unityでボクセルモデルを動かす⑥(終)

MagicaVoxelで作ったボクセルにBlenderでアニメーションをつけてUnityで動かそう、の6回目。

 

使用するツール

・MagicaVoxel 0.97.4

Blender 2.74

・Unity 5.3.4f1

 

前回はBlenderでボクセルモデルに対して歩く、待機の2つのアニメーションを作成した。

今回はそれをUnityに取り込んで動かす、最終回となる。

もうちょっとなので頑張ろう。

 

・Unityへインポート

Blenderで作成したものをUnityに取り込む。

以前は一旦Blenderでfbxファイルにエクスポートする必要があったのだが、なんと最近のバージョンではBlenderのファイルを直接取り込めるようになっている。すごい。

 

とりあえず今回の作業用に空の3Dプロジェクトを作成した。

見慣れたインターフェイスにどことなく安心感が・・・。

f:id:cores0316:20160727102932p:plain

 

Projectビューにblendファイルを直接放り込んでやろう。

すると下記のようになる。

f:id:cores0316:20160727103228p:plain

emilyの右矢印をクリックして展開すると、いくつか知らないものもあるが作成したアニメーションが格納されているのが見える。

f:id:cores0316:20160727110805p:plain

 

 ここで、アニメーションに少し手を加えないといけないのでemilyを選択してInspectorビューに表示されたAnimationsボタンをクリックする。

f:id:cores0316:20160727142455p:plain

真ん中辺りに表示されているClipsに作成したアニメーションの一覧が表示されているので、Walkを選択する。

すると、下にWalkの詳細が表示されるので、「Loop Time」のチェックボックスにチェックを入れておこう。

その後、下にスクロールしてApplyボタンを押す。

f:id:cores0316:20160727142946p:plain

これで歩くアニメーションをループ再生できるようになる。

 

 

3D空間にCubeで床を作って、emilyをHierarchyビューに置いてみた。

親オブジェクトはAnimatorを持っているただのGameObjectのようだ。

ただし、Animation Controllerが割り当てられていない。

f:id:cores0316:20160727111704p:plain

 

モデルやアニメーションに必要なものは子オブジェクトとして紐付いている。

f:id:cores0316:20160727111939p:plain

f:id:cores0316:20160727112109p:plain

 

 

・ボクセルモデルのテクスチャを設定

とりあえず真っ白なのが味気ないので、テクスチャを貼って見慣れた姿にする。

blendファイルの中には存在しないみたいなので、MagicaVoxelでエクスポートしたときに出力されたpngファイルをUnityに取り込む。

 

Texturesフォルダを新たに作成し、pngファイルを取り込んだ。

f:id:cores0316:20160727113258p:plain

 

blendファイルをインポートしたときに作成されたMaterialsフォルダを開いて、中に入っているマテリアルを選択する。

右に表示されたInspectorビューの赤枠をクリックして、先ほど取り込んだpngファイルを選択しよう。

f:id:cores0316:20160727113919p:plain

 

このマテリアルは子オブジェクト(Emily)に設定されているので、それが反映されてテクスチャが表示される。

これでOK。

f:id:cores0316:20160727114223p:plain

 

 

・Animation Controllerの設定

次にAnimation Controllerを作成する。

AnimationControllerフォルダを作成し、その中にEmilyAnimというAnimation Controllerを作成した。

f:id:cores0316:20160727115043p:plain

EmilyAnimを選択した状態でAnimatorビューを開き、Animatorタブを掴んで別枠に表示させる。下の絵はAnimatorビューを右側に持っていった場合。

f:id:cores0316:20160727115602p:plain

Projectビューの方で取り込んだBlenderファイルを展開し、中に入っている「Idle」と「Walk」をAnimatorビューの方にD&Dする。

Animatorビューが下記の図のようになっていればOK。

f:id:cores0316:20160727120055p:plain

もしWalkの方を先にD&Dした場合には、Walkの方がオレンジになっているかもしれない。その場合はIdleを選択して右クリックし、「Set as Layer Default State」を選択すればいい。

 

別枠に表示していたAnimatorビューはProjectビューと同じ枠に戻しておこう。

 

引き続きAnimatorビューで、Transitionを作成する。

Idleを選択して右クリックし、「Make Transition」を選択する。

矢印の先を選ぶようになるので、Walkを指定する。

同じように、WalkからMake TransitionでIdleを指定する。

下記のようになる。

f:id:cores0316:20160727120851p:plain

 

次に、左側の「List is Empty」と書いてある右上の+ボタンを押して、Bool型のアニメーションパラメータを追加する。

f:id:cores0316:20160727121526p:plain

walkFlagという名前にした。

f:id:cores0316:20160727121746p:plain

 

現在、アニメーションは基本姿勢のIdle(棒立ち状態)から動かないようになっているので、先ほど追加したwalkFlagを使用してwalkFlagがtrueのときにIdleからWalkへ、falseのときにWalkからIdleへ遷移するように条件を設定する。

 

IdleからWalkに伸びているTransitionを選択すると、右側のInspectorビューに詳細が表示される。

Conditionsの下にある+をクリックすると、IdleからWalkに遷移する条件を決めることが出来る。今回は最初に表示された「walkFlagがtrueのとき」のままでよいので、これでOK。

f:id:cores0316:20160727122939p:plain

 

次に、WalkからIdleに伸びているTransitionを選択して、同じようにConditionsを追加する。こちらは「walkFlagがfalseのとき」に遷移したいので、右側をfalseにしておく。

f:id:cores0316:20160727123317p:plain

ここではもう一つ、ついでに修正しておきたいことがある。

真ん中に表示されているSettingsのところで、WalkからIdleへの移り方が示されているのだが、今のままだとどんな動きになるかというと、「walkFlagがfalseになってから1秒ちょっと経過した頃に直立に戻る」という感じになる。

イメージとしては、プレイヤーがキー入力をやめても1秒ちょっとは手足をばたばたさせる感じになる。これはいかん。

 

下のIdleをドラッグして左の方へ持って行き、移り変わりの範囲も左の方に設定する。

上の「Has Exit Time」のチェックも外す。

f:id:cores0316:20160727125417p:plain

これですぐにIdleへ移るようになる。

 

ここまでの作業が終わったら、Hierarchyのemilyを選択してInspectorビューに表示されたAnimatorにEmilyAnimをアタッチする。

f:id:cores0316:20160727130607p:plain

 

 

・ボクセルモデルを動かす

アニメーションさせるための準備は整った。

emilyにCharacter Controllerを追加し、動かすためのスクリプトを作成する。

 

まず、Character Controllerの追加から。

Add ComponentからPhysics→Character Controllerで追加する。

追加したらコライダーを適当に真ん中に来るように調整する。

f:id:cores0316:20160727132643p:plain

 

次にスクリプトの作成。

新たにScriptsフォルダを作成して、その中にEmilyController.csを作成する。

f:id:cores0316:20160727133010p:plain

スクリプトの内容は以下の通り。

// スクリプトここから

using UnityEngine;
using System.Collections;

public class EmilyController : MonoBehaviour {

    CharacterController controller;
    Animator animator;

    Vector3 moveDirection = Vector3.zero; // 移動方向計算用
    float gravity = 9.8f;                 // 重力
    float speedZ = 3.0f;                  // 進行方向の速度

    // Use this for initialization
    void Start () {

        // 必要なコンポーネントを取得
        controller = GetComponent<CharacterController>();
        animator = GetComponent<Animator>();
    }
    
    // Update is called once per frame
    void Update () {

        // Inputを検知して前に進める
        if (Input.GetAxis("Vertical") > 0.0f)
        {
            moveDirection.z = Input.GetAxis("Vertical") * speedZ;
        }
        else
        {
            moveDirection.z = 0;
        }

        // 方向転換
        transform.Rotate(0, Input.GetAxis("Horizontal") * 3, 0);

        // 重力分の力を毎フレーム追加
        moveDirection.y -= gravity * Time.deltaTime;

        
        // 移動実行
        Vector3 globalDirection = transform.TransformDirection(moveDirection);
        controller.Move(globalDirection * Time.deltaTime);

        // 移動後接地していたらY方向の速度はリセット
        if (controller.isGrounded) moveDirection.y = 0.0f;


        // 速度が0以上なら歩きフラグをtrueにする
        animator.SetBool("walkFlag", moveDirection.z > 0.0f);

    }
}

// スクリプトここまで

 

簡単に説明すると、上入力でモデルが向いている方向に移動し、左右入力で向きが変わる。ジャンプは無いけど一応自由落下するようにしている。

そして、上入力があるときはアニメーションを切り替えるwalkFlagがtrueになり、歩くアニメーションが再生される、というもの。

スクリプトを保存したら、emilyにアタッチする。

f:id:cores0316:20160727141033p:plain

 

 

早速実行してみよう。

f:id:cores0316:20160727144028g:plain

う、動いた・・・!

ちゃんと歩くモーションもループ再生されている。

 

 

というわけで、想定していたよりも非常に長くなってしまったが目的達成である。

最後まで見てくれた人も本当にお疲れ様でした。

できるだけ間違いのないよう気をつけたつもりだけども、誤りやわかりにくいところがあったときはごめんなさい。

挑戦してみようと考えている人や同じようなところで躓いている人の参考になれば幸い。

 

多分もっと効率が良かったり正しいやり方というのがあるのだろうけど、それはまたやる気が溜まったときに調べてみよう。

MagicaVoxel→Blender→Unityでボクセルモデルを動かす⑤

MagicaVoxelで作ったボクセルにBlenderでアニメーションをつけてUnityで動かそう、の5回目。

 

使用するツール

・MagicaVoxel 0.97.4

Blender 2.74

・Unity 5.3.4f1

 

前回はボクセルモデルとボーンを関連付けて、ウェイトの設定まで行った。

あと追記でマスターボーンの追加についても触れた。

今回は、設定したウェイトを使ってアニメーションを作成してみる。

作成するのは、歩く動作と、何もしない待機動作の2つ。

 

・必要なウィンドウの表示

これからの作業には、最初から下に表示されているTimeline(水色枠)と、もう一つDope Sheetというウィンドウが必要になる。

f:id:cores0316:20160727021644p:plain

赤枠をクリックして選択することでも表示できるが、切り替えは面倒なのでどちらも表示した状態にしよう。

赤枠のすぐ左下隅にある「///」が逆向きになったようなところをドラッグすると、2つ目のTimelineが表示されるので、どちらかをDope Sheetに切り替えてやる。

これでOK。

f:id:cores0316:20160727022913p:plain

 

 

・歩行アニメーション作成

まず、Dope Sheetの赤枠をクリックして、Action Editorに切り替える。

f:id:cores0316:20160727024552p:plain

すると、すぐ横のインターフェイスが下記のようになったはず。

f:id:cores0316:20160727025410p:plain

「New」と書かれたボタンをクリックして、新しいアクションを作成する。

Actionという名前になっているのでWalkに変更し、すぐ隣の「F」と書かれたボタンをクリックする。

何やらせっかく作成したアニメーションも使うユーザ(モデル?)が登録されていないと保存されないらしく、ユーザの有無に関わらず保存されるようにこのボタンを押すらしい。Blenderの設計思想はよくわからん・・・。

とりあえず、下記のようになっていればOK。

f:id:cores0316:20160727030949p:plain

 

Action EditorかTimelineの緑色のラインをドラッグで動かして、「1」と表示されるところに移動する。

f:id:cores0316:20160727031930p:plain

これで準備完了だ。

 

歩く動作の基本姿勢となる、「気をつけ」のポーズを作る。

3D ViewをPose Modeに切り替えて、テンキーの1を押して正面からの視点にする。

f:id:cores0316:20160727032525p:plain

Arm_Upper_Rを右クリックで選択してRキーを押して、腕を下ろすような形にして左クリックで確定する。ちなみにもう一度Rキーを押すと別方向の回転もできる。

Arm_Upper_Lも同じようにする。

f:id:cores0316:20160727033612p:plain

これで完成。

 

この状態をキーフレームとして登録する。

まず、マスターボーン以外を選択した状態にする。Aキーを2回押して全部のボーンを選択した後、SHIFTキーを押しながらマスターボーンを右クリック2回でできる。

f:id:cores0316:20160727034402p:plain

その状態でIキーを押すと、Insert Keyframe Menuというメニューが出てくるので、その中からLocRotを選択する。これは選択したボーンのLocation(位置)とRotation(回転)を登録するという意味。

f:id:cores0316:20160727034802p:plain

 

すると、Dope Sheetの該当フレームにキーフレームが追加される。

f:id:cores0316:20160727035443p:plain

これで最初のポーズが完成。

 

次に、左足から踏み出すとして歩き始めのポーズを作る。

キーフレームは6あたりに移動しておく。

f:id:cores0316:20160727040604p:plain

ここからは、体全体を触ることになるので、いろんな角度から確認しつつ試行錯誤しながら作業する。

ArmやLegを動かすときは、ShoulderやHipもわずかに動かしてやると自然な感じに近づく。

 

こんな感じになった。

f:id:cores0316:20160727044013p:plain

右から見るとこんな感じ。

f:id:cores0316:20160727044109p:plain

Action EditorかTimelineの緑色のラインをドラッグすると、登録したポーズの間を補間した動きが見られるので、おかしな動きをしていないか確認する。

 

次は12フレームに移動して、手足を一番大きく開いたポーズを作る。

こんな感じになった。

f:id:cores0316:20160727045330p:plain

 

次は17フレームに移動して、基本姿勢に戻る前のポーズを作る。

こんな感じになった。

f:id:cores0316:20160727045622p:plain

 

次に、20フレームに移動して1フレーム目と同じポーズを作る。

登録したポーズはコピペができるので、その機能を使おう。

Action Editorの「Dope Sheet Summary」を右クリックすると、縦一列の◇がオレンジになるので、この状態でCtrl + Cキーを押す。

f:id:cores0316:20160727051016p:plain

次に、左クリックで緑色のラインを20のところにあわせて、Ctrl + Vキーを押すとペーストできる。

f:id:cores0316:20160727051622p:plain

 

これで半分の動作ができた。

緑色のラインを動かしてみて、おかしなところが無いかよく確認する。

 

後半のポーズは、反転ペースト?の機能を使って楽をする。

25フレームに、6フレームのポーズを反転してペーストしよう。

6フレームを選択してCtrl + Cキーを押して・・・

f:id:cores0316:20160727052523p:plain

25フレームに移動して、この状態でCtrl + SHIFT + Vキーを押すと・・・

f:id:cores0316:20160727052822p:plain

反転した状態でペーストされる。

f:id:cores0316:20160727053250p:plain

 

同じようにして、12フレームを31フレームに、17フレームを36フレームにコピー&反転ペーストしよう。

最後に、39フレームに基本姿勢と同じポーズを登録する。

 

緑色のラインを動かしてみて、おかしなところが無いかよく確認する。

問題なければ、これで完成だ。

 

Timelineを操作して再生してみよう。

Startに1、Endに39を設定して、右の再生ボタンを押すと再生が始まる。

f:id:cores0316:20160727054622p:plain

 

f:id:cores0316:20160727055220g:plain

まぁまぁの出来じゃなかろうか。

 

 

・待機アニメーションの作成

もう一つ、歩いていないときに再生されるアニメーションも作成しておく。

名前は「Idle」として、今回は特に凝ったものにせずただ6フレーム棒立ちするだけのものにした。

f:id:cores0316:20160727054256p:plain

 

 

ここまでの作業を保存しておく。

ウィンドウを閉じる前に、作成したアニメーションに対して「F」ボタンが押されているか確認すること。

 

次回は、ついにUnityの登場となる。

作成したものを取り込んで、Unityで動かしてみる。

MagicaVoxel→Blender→Unityでボクセルモデルを動かす④

MagicaVoxelで作ったボクセルにBlenderでアニメーションをつけてUnityで動かそう、の4回目。

 

使用するツール

・MagicaVoxel 0.97.4

Blender 2.74

・Unity 5.3.4f1

 

前回はボクセルモデルにボーンを設定したところまで進んだ。

今回はボクセルモデルとボーンを関連付けて、ウェイトというものを設定する。

 

・ボクセルモデルとボーンを関連付け

もしモードがObject Modeになっていなかったら、Tabキーを押すか下図の水色枠をクリックしてObject Modeにする。

そしてボクセルモデルを右クリックで選択すると、赤枠のようなレンチのアイコンが表示されるので、それを選択する。

f:id:cores0316:20160724011349p:plain

 

表示された「Add Modifier」をクリックすると、追加するものの一覧が出るので、「Armature」を選択する。

f:id:cores0316:20160724012256p:plain

 

Objectと表示された下の空になっている部分をクリックすると、「Armature」という名前が表示されるのでそれを選択する。もし自分でArmatureの名前を変更していたら、変更された名前が表示されるはずなのでそれを選択する。

これでOK。

f:id:cores0316:20160724012545p:plain

 

ついでに後の作業を見やすくするために、ボーンの表示形式を切り替える。

右クリックでボーンを選択して、赤枠の人型アイコンをクリックすると、Displayという項目がある。

f:id:cores0316:20160724021732p:plain

 

今はOctahedというのになっているので、これをStickに変えておく。

その下にある「X-Ray」のチェックボックスにもチェックを入れておく。

f:id:cores0316:20160724022349p:plain

 

・ウェイトを設定する

※ここから先の話が面倒な人は、「Armature Deform With Automatic Weights」でググると幸せになるかもしれない

 

ボクセルモデルとボーンが関連付いたので、ウェイトを設定する準備が整った。

これからは、下記のモードを切り替えながらそれぞれのボーンにウェイトを設定していく。

 

・Pose Mode

f:id:cores0316:20160724025743p:plain

右クリックでボーンを選択してドラッグすると角度を変えることができる。ウェイトを設定してあるとそれに従って曲がるので、これでポーズを作ることができる。

 

・Weight Paint

f:id:cores0316:20160724033148p:plain

丸ブラシのようなものを使って、頂点にウェイトを「塗る」ことができる。

塗る範囲やウェイトの変化量などは、左の「Tools」タブにあるBrushから変更できる。

詳細はこちらにあるので目を通しておいた方がいい。

https://wiki.blender.org/index.php/Doc:JA/2.6/Manual/Modeling/Meshes/Weight_Paint

 

正直なところ、この2つのモードの切り替えをスムーズにする方法をよく理解していないので、以降は無駄な操作をしているかもしれない・・・。

 

まず、頭のウェイトを塗ってみよう。

Object Modeでボーンを選択した状態でCtrl + Tabキーを押すとPose Modeになるので、Headボーンを選択する。(水色になる)

f:id:cores0316:20160724053546p:plain

そのままボクセルモデルを選択すると、表示はObject Modeに戻る。

そこからさらにCtrl + Tabキーを押すと、Headボーンが水色の状態でWeight Paintになる・・・はず。

f:id:cores0316:20160724054329p:plain

こうすることで、「今から塗るウェイトはHeadボーンに設定するものですよ」という状態にできる。

 

次に、左上の球体のアイコンをクリックして、ブラシを選択する。

ウェイトを加算するときは「F Add」、間違ったりして減算したいときは「F Subtract」を選択するといい。今はひたすら加算するので「F Add」にする。

f:id:cores0316:20160724052213p:plain

 

この先は人それぞれ好みになるのだけど、塗る範囲や強さを調整する。

自分は全体をざっと塗るよりは塗りたい頂点を細かく選んでいきたいので、WeightとStrを強くして塗る範囲は小さくした。Curveの曲線も、○の中はほぼ一番強い状態にした。

f:id:cores0316:20160724055140p:plain

これで準備が整った。

 

ウェイトを塗る作業は非常に地道な作業なので、お茶とお菓子と好きな音楽でも用意して根気よく塗っていく。

f:id:cores0316:20160724060552p:plain

今作業している頭は他のボーンの影響を考えないで済むので、頭全体を真っ赤に(ウェイトが最大値の1.0)なるまで塗っていく。

右クリックからドラッグすると、今塗っている状態でボーンを動かしたときの形が見られるので、塗り残しが無いかチェックできる。

もし塗り残しやウェイトが1.0に満たない場所があると、みょーんと伸びるポリゴンが出てくる。

 

完成。

f:id:cores0316:20160724072640p:plain

ぐきっ

f:id:cores0316:20160724073025p:plain

ごきっ

f:id:cores0316:20160724073050p:plain

塗り残しも無さそうだ。

 

 

こんな感じで、それぞれのボーンを選択して頂点にウェイトを設定していく。

ただ、これ以降の作業は頭ほど単純な作業にはならないのでとても難しくなる。

というのも、頭はHeadボーンのことだけ考えて設定すればよかったため、全部真っ赤にすればよかった。

しかし、首から下は自然な人間の動きになるように、関節にあたる部分は隣り合ったボーンにもそれぞれいい感じのウェイトを割り当てるようにしないといけない。

 

参考までに、自分が塗った結果を貼っておく。

もとのポリゴンの形が原因で、曲げると形が崩れるところもあるけど今回は気にしない。

 

首の付け根から肩までがわずかに追従する程度

f:id:cores0316:20160724082834p:plain

 

f:id:cores0316:20160724083130p:plain

f:id:cores0316:20160724083146p:plain

 

f:id:cores0316:20160724083433p:plain

 

f:id:cores0316:20160724083542p:plain

 

f:id:cores0316:20160724083838p:plain

 

腰や太もも辺りのウェイトが少なめなのは、強く追従すると腰周りのポリゴンが破綻するため。

f:id:cores0316:20160724084038p:plain

f:id:cores0316:20160724084056p:plain

 

 

これでボーンを動かすとそれに従ってボクセルモデルも動くようになった。

ここまでの作業結果を保存しよう。

次回はボーンを動かしてアニメーションを作成する。

 

 

// 2016/07/26 追記

・マスターボーンの追加

上の画像の中で、今までの説明で追加した覚えのないボーンがあるのに気付いた人もいるかもしれない。

身体の中心から真後ろに一本突き出ている。

f:id:cores0316:20160726102704p:plain

これはマスターボーンと呼ばれるものなのだが、前回の説明にどうもうまく入れられなかったのでここに書いておく。

 

まずはボーンの親子関係について。

前回、最初に作ったBodyを基点として、上方向にChest、さらに三方向にHead、Shoulder_L、Shoulder_Rと作った。

このようにtipから派生して作成したボーンは、この順番に従って親子関係というものを持っている。

逆のrootから作成したボーンは、親子の関係を持たない。

この状態は、画面右上に出ている一覧からArmatureを展開していくと見ることができる。

f:id:cores0316:20160726104556p:plain

※これはマスターボーンを追加する前

 

また、Edit Modeで各ボーンを選択して、右の骨アイコンを選択することでも確認できる。こちらは変更もできる。

f:id:cores0316:20160726105504p:plain

 

で、マスターボーンはどのような立ち位置になるのかというと、名前の通り全てのボーンの中で最上位の親となるように作成する。

こうすることで、マスターボーンを移動するとモデル全体が移動する、というように全体の動きをこいつ一本にまかせることができる。

他のボーンはポーズを取るための移動や回転に専念することができるわけだ。

 

というわけで、まずはボーンを追加する。

Edit ModeでBodyのrootを選択した状態でEキーを押す。

もし2つのボーンが表示されたら、以前有効にしたX-Axis Mirrorがそのままになっているはずなので、左のOptionタブで表示してチェックを外すこと。

モデルの後ろに真っ直ぐ作成したいので、Yキーを押してY軸方向に固定し、適当な長さで確定する。

f:id:cores0316:20160726111606p:plain

また初期設定の名前になっているので、「Master」に変更する。

 

次に、親子関係を変更する。

先ほどの骨アイコンを押した状態でBodyを選択し、赤枠のところをクリックすると親として指定できるボーンの一覧が表示されるので、「Master」を選択する。

f:id:cores0316:20160726112405p:plain

 

同様に、Hip_L、Hip_Rの親にもMasterを設定する。

 

設定後、右上を見ると下記のようにMaster以外のボーンがインデント1つ下がったような感じになっているはず。

f:id:cores0316:20160726113036p:plain

また、Pose ModeでMasterを右クリックで選択してドラッグすると、ボクセルモデルとボーンの全部が一緒になって動いてくれるはず。

これで完成。

忘れず保存しておく。

MagicaVoxel→Blender→Unityでボクセルモデルを動かす③

MagicaVoxelで作ったボクセルにBlenderでアニメーションをつけてUnityで動かそう、の3回目。

 

使用するツール

・MagicaVoxel 0.97.4

Blender 2.74

・Unity 5.3.4f1

 

前回はMagicaVoxelで作成したボクセルモデルをBlenderにインポートしたところまで進んだ。

今回はボーンを設定していく。

 

・3Dカーソルの位置を調整

ボーンを体の中心に設定するために、まずは3Dカーソルの位置を調整する。

f:id:cores0316:20160723020947p:plain

赤白線の丸が3Dカーソル。

 

Nキーを押すとプロパティ・シェルフというパネルが出てくるので、その中にある3D Cursorの座標に数字を入力する。今回は、(0.0, 0.0, 0.9)のところにした。

f:id:cores0316:20160723030242p:plain

 

・最初のボーン作成

いよいよボーン作成に入る。

Zキーを押すと表示方法をSolidとWireframeで切り替えることができるので、今後の作業が見やすいようにWireframeにしておく。

 

SHIFT + Aキーで表示されるメニューからArmature → Single Boneを選択すると、3Dカーソルの位置にボーンが1つ作成される。

f:id:cores0316:20160723031800p:plain

f:id:cores0316:20160723031933p:plain

3Dカーソルの位置にある丸が根元(root)で、上の小さい丸が先端(tip)。

この丸が重なって複数のボーンが繋がり、角度がつくことで関節のような動きができるようになる。

 

見ての通り、今の状態だと長すぎて腰から首までが曲げられない。

それでは困るので長さを調整しよう。

 

まず、現在のObject ModeをEdit Modeに切り替える。

Tabキーを押すか、下図の赤枠をクリックすれば切り替えることができる。

f:id:cores0316:20160723033023p:plain

 

切り替えたら、tipを右クリックしてドラッグすると大きさを変えることができる。

ただ、そのまま変えようとしてもなかなかまっすぐにはできないので、Zキーを押してみよう。するとZ軸だけを変化させることができるようになる。

f:id:cores0316:20160723033833p:plain

これで好みの大きさにしたら左クリックで確定する。

自分は胸のところあたりまでの長さにした。

f:id:cores0316:20160723034144p:plain

これで最初のボーンが完成だ。

 

補足として、これ以降3Dカーソルは使用しないので、うっかり画面を左クリックしてカーソルを動かしてしまっても気にしないでいい。

 

・繋げてボーンを作成

最初のボーンに繋げてどんどん作成していくが、さっきとはちょっと違う方法で作成していく。

tipを選択した状態で、Eキーを押してマウスを動かしてみよう。

選択されたtipの地点がrootとなった、新しいボーンの大きさを決める状態になる。

f:id:cores0316:20160723035027p:plain

今自分が作りたいのは胸から首あたりまでのボーンなので、先ほどと同様にZキーを押してまっすぐなボーンを作成した。

f:id:cores0316:20160723035747p:plain

 

同じ手順で頭も作成。

f:id:cores0316:20160723040132p:plain

 

・左右対称のボーン作成

次に手の作成。

ここでは左右の手を一度に作れるX軸ミラーの機能を使う。

ウィンドウ左側の「Option」タブをクリックして、X-Axis Mirrorのチェックボックスにチェックを入れる。これでOK。

f:id:cores0316:20160723041650p:plain

 

 首のところの丸を選択してから、SHIFT + Eキーを押してみよう。

左右対称のボーンを作成することができるようになる。

f:id:cores0316:20160723041909p:plain

 

これは肩にしたかったので、これで確定した。

f:id:cores0316:20160723042221p:plain

 

さらにSHIFT + Eキーを押して、腕を作成していく。

この部分はX軸に沿っているので、大きさを決めるときにXキーを押すとやりやすい。

f:id:cores0316:20160723042645p:plain

f:id:cores0316:20160723042658p:plain

これで上半身が出来上がった。

 

もう一息、引き続き下半身も作成する。

やり方は今までと同じ。

 

腰。

f:id:cores0316:20160723043114p:plain

そして足。

f:id:cores0316:20160723043236p:plain

 

ようやく完成!

つ、疲れた・・・。

f:id:cores0316:20160723043650p:plain

 

・ボーンの名称を整理

最後に、作成したボーンの名前を整理しておく。

どこに名前が出ているかと言うと、ウィンドウの右上部分。

f:id:cores0316:20160723044039p:plain

Armatureというオブジェクトの下にボーンが並んでいるが、初期名称の「Bone」にどんどん追加していったので、「Bone.(数字)」という名称になってしまっている。これではわかりにくい。

 

名称をダブルクリックすると変更できるので、下記のようにした。

右側は末尾の「L」を「R」にした。

f:id:cores0316:20160723045601p:plain

 

 

ここまでの作業結果を保存して、今回はここまで。

次回はボクセルモデルとボーンを関連付けて、連動する度合い(ウェイト)を設定する。

 

MagicaVoxel→Blender→Unityでボクセルモデルを動かす②

MagicaVoxelで作ったボクセルにBlenderでアニメーションをつけてUnityで動かそう、の2回目。

 

使用するツール

・MagicaVoxel 0.97.4

Blender 2.74

・Unity 5.3.4f1

 

前回はMagicaVoxelで下記のようなボクセルモデルを作成して、エクスポートしたところまで進んだ。

f:id:cores0316:20160719131706p:plain

f:id:cores0316:20160719150854p:plain

 

今回はこれをBlenderに取り込むところから。

 

・objファイルをBlenderにインポート

Blenderを起動すると下記の画面になる。最初から用意されている立方体はいらないので、右クリックで選択(フチがオレンジになる)してDeleteキーを押して削除する。

f:id:cores0316:20160722044321p:plain

 

メニューからobjを指定して前回作成したものをインポートすると・・・

f:id:cores0316:20160722052528p:plain

f:id:cores0316:20160722053022p:plain

 

!?

どうやら読み込んだそのままだと大きすぎるようなので、いい感じの大きさに調整する。

 

読み込んだモデルを選択してSキーを押すとマウス移動で縮尺を変えられるようになるけど、ここはマウスを使わずにそのまま0.1と入力してEnterキーを押すことにした。これで10%の大きさになるらしい。今回は特に細かい縮尺にこだわりは無いので、これで行くことにする。

f:id:cores0316:20160722054558p:plain

 

視点移動関係の操作は下記の通り。

回転   ・・・マウスホイールクリックしてドラッグ

拡大縮小 ・・・マウスホイール上下ころころ

注視点移動・・・SHIFTキー+マウスホイールクリックしてドラッグ

 

もしテンキーがあるのなら、とても便利なショートカットがあるので覚えておきたい。

今回よく使ったのは

1   ・・・正面から見る

3   ・・・横から見る

5   ・・・透視投影(Perspective)と平行投影(Orthographic)の切り替え

 

下記は注視点を移動して正面に切り替えたところ。

f:id:cores0316:20160722070539p:plain

ここで平行投影に切り替えるとこのようになる。

f:id:cores0316:20160722071705p:plain

平面になったように見えるけどカメラを斜めにするとちゃんと立体なので大丈夫(?)。

この後の作業ではこっちの方が都合が良いので、これで作業を続ける。

 

それにしても、テクスチャも貼られてないようでなんだか灰色一色で味気ない。

MagicaVoxelで見ていたような状態にしたい。

 

下記の赤枠をクリックすると、3Dモデルの表示方法を切り替えることができる。

f:id:cores0316:20160722072412p:plain

今はSolidになっているので、Textureをクリックしてみる。すると・・・

 

f:id:cores0316:20160722072845p:plain

お、何やら見覚えのある色が。しかし暗い。

実は、最初から配置してあった立方体と一緒にライトが3D空間に配置されており、その影響を受けてこのような表示になっている。

ホイールを回して視点を引いてみると、ライトが見えた。右クリックでライトを選択して、表示されたXYZ軸をつまんでいい感じのところに持ってきてやる。右端に見えている黒いのは、同じく最初から配置されているカメラだけど、今回は使用しないので省略。

f:id:cores0316:20160722073201p:plain

f:id:cores0316:20160722073550p:plain

前方斜め上くらいに持ってきた。ひとまずこんなところでよしとしよう。

 

これで次の作業の準備が整った。

ここまでの作業結果を忘れずに保存しておく。

 

次はこのモデルに沿って、アニメーションの骨格となるボーンを作成することになる。

今回はここまで。