Gaming Life

一日24時間、ゲームは10時間

MagicaVoxelで作成したモデルをUE4で利用する (2) StaticMesh編

[MagicaVoxelで作成したモデルをUE4で利用する (2) StaticMesh編]

はじめに

 この記事は前回の続きです。前回の記事から見ていただくことをおすすめします。

ai-gaminglife.hatenablog.com

 第二回ではボーンを入れずアニメーションさせない、StaticMeshとして書き出したいときの方法を説明する。完成形は以下の通り。

f:id:ai_gaminglife:20180609152443p:plain f:id:ai_gaminglife:20180609152418p:plain

 頂点数208、ポリゴン数104と十分ゲームに使える少なさ。UVテクスチャも書き出されているのでマスク用テクスチャを作って質感調整などもできる。

 なおこの記事は以前公開した記事と大部分内容が被っている。この後SkeletalMeshとして書き出す解説もする為、繰り返しになるが話をわかりやすくするためこの記事を書いている。

[被ってるブログ]

1.MagicaVoxelでモデルを作成しQubicle用にエクスポートする

 まずはMagicaVoxelでボクセルモデリング。本筋から外れる為MagicaVoxelの使い方の説明はしないが直感的に操作出来るようになっているのでそう難しくないはず。が、UE4に持っていくに当たり注意することが一点。モデルの中心とワールドの中心を揃えなければならない。これをしないと後々面倒なことになる。

f:id:ai_gaminglife:20180609152123p:plain


 モデル全体を移動させるには以下の手順を踏む。

  1. Viewの"Grid","Frame" を選択。これでワールドにグリッド線が表示される。

  2. EditパネルからSelect -> Allを選択。

  3. BrushパネルのPaintの下にある十字矢印マークを選択。モデルを移動させることが出来る。

f:id:ai_gaminglife:20180609152136g:plain

 本当に真ん中か不安になったらMirrorをONにし、PaintやAttachしてみて試してみるといい。


 モデルの中心を揃えたらエクスポート。今回はQubicle独自形式の.qbで書き出す。

 右下のExportから"qb"を選択し、任意の場所に保存する。これでモデルをQubicleに持っていくことが出来る。

2.Qubicleで調整する

 Qubicleを起動。初期画面左下のファイルのアイコンをクリックし、先程エクスポートした.qbファイルを選択する。

f:id:ai_gaminglife:20180609152159p:plain

 .qbファイルを開くとこの様に中心と向きがずれている。

f:id:ai_gaminglife:20180609152207p:plain

 というわけでこれを直す。左クリックでオブジェクトを選択し、Transfromタブから"Flip Z"を選択。これでオブジェクトを正しい方向に向かせることが出来る。

f:id:ai_gaminglife:20180609152216p:plain

 続けてモデル中心から出ている赤矢印、青矢印をつかみ、x,z座標を動かして中心を本来のものに揃える。

f:id:ai_gaminglife:20180609152224p:plain

 続いて最終的にfbxとして書き出す時に頂点数を減らす為にメッシュを切り分ける。オブジェクトをダブルクリックしボクセル編集モードに移行。

f:id:ai_gaminglife:20180609152232p:plain

 Mキーをクリックし、"Rectangular Select Tool"ツールを選択。マウス左ボタンのドラックランドドロップで範囲を選び、Modifyタブの"Split off"を選択する。これでメッシュを切り分けることができた。今回は頭だけを切り分ける。

f:id:ai_gaminglife:20180609152246p:plainf:id:ai_gaminglife:20180609152250p:plain


 Rectangular Select Toolで選択しやすいようにカメラを正面に向けたりしたい。そんなときはCamera -> Perpendiculer View -> Frontを選択すればよい。


 左上にある左向き矢印アイコンを押すと元の画面に戻ることができる。

3.fbxファイルとして書き出す

 元の画面に戻ったらShiftキーを押しながら左クリックでオブジェクトを複数選択する。

 Fileタブから"Export FBX"を選択すると画像の様なウィンドウが出る。

f:id:ai_gaminglife:20180609152320p:plain

 ここでどの様な設定で書き出すか色々変更することが出来る。が、今回は画像の通り初期設定のままで書き出してもOK。OKボタンを押して任意の場所に.fbxファイルを保存する

4.Blenderで調整し書き出す

 Blenderを起動。最初に表示されている立方体を右クリック選択してdeleteしたらファイル->インポートで先程書き出したfbxをインポートする。

 切り分けたパーツをそのままエクスポートすると別メッシュとして認識されるのでメッシュを結合しなければならない。ということでオブジェクトモードのままShift右クリックで全てのメッシュを選択、Ctrl+Jでオブジェクトを結合する。

 続いてピボットポイントを変更する。今のままでは変な位置にピボットポイントがあるので原点をピボットポイントに変更する。

 まずShift+Sキーで「カーソル → 原点」を選択。3Dカーソルを原点に移動させる。続いて先程結合したメッシュを選択した状態で、画面左下(オブジェクトモードと表示されているところの隣)のオブジェクトからトランスフォーム->原点を3Dカーソルに移動を選択。これでピボットポイントを3Dカーソルの位置=原点に変更できる。

f:id:ai_gaminglife:20180609152328p:plain

 次にトランスフォーム値をリセットする。メッシュを選択した状態でCtrl+Aキーを押し、「回転と拡縮」、「位置」をクリック。これでトランスフォーム値をリセットできる。

f:id:ai_gaminglife:20180609152335p:plain

 最後にもう一つ。Qubicleで書き出したUVテクスチャは解像度が足りず、影がおかしな付き方をしてしまう。そこでBlender上で新たにライトマップ用のUVテクスチャを用意する。

 メッシュを選択した状態でプロパティパネルのデータを選択。UVマップの右側のプラスボタンを押し、新たに用意されたUVMapの右側にあるカメラアイコンを選択。

f:id:ai_gaminglife:20180609152343p:plain

 Tabキーを押し編集モードに移動。Aキーを押してメッシュの全ての頂点を選択したらUキー->ライトマップパックを選択して画像の設定でOKを押す。

f:id:ai_gaminglife:20180609152351p:plain

 これでBlender上での調整終了。このままfbxとして書き出す。

 メッシュを選択した状態でファイル->エクスポート->FBXを選択。画像のように設定。

f:id:ai_gaminglife:20180609152401p:plainf:id:ai_gaminglife:20180609152402p:plain

名前をつけたらFBXをエクスポートをクリック。これでUE4にインポートする準備が整った。

UE4にモデルをインポートする

 UE4を起動。コンテンツブラウザのインポートから画像の様な設定でモデルを取り込む。

f:id:ai_gaminglife:20180609152409p:plain

 自動でテクスチャとマテリアルを持った3Dモデルが取り込まれたはず。

 続いてライトマップの設定を変更。コンテンツブラウザでStaticMeshをダブルクリック。DetailパネルのGeneral Settingから

  • Lightmap Resolution を128に変更
  • LightMap CoordinateIndex を1に変更

 これで影の問題は解決したが見て分かる通りテクスチャがボケボケになっている。というわけで最後にこの問題を解決しよう。

 コンテンツブラウザで取り込んだテクスチャをダブルクリック。詳細パネルで以下の様に設定する。

  • Compression -> Compression Setttingを "UserInterface2D"に変更

  • Texture -> Filterを "Nearest" に変更

  • Level Of Detail -> Texture Groupを "2D Pixels" に変更

 この状態で保存する。

f:id:ai_gaminglife:20180609152418p:plain

 これで望み通りのモデルがUE4に取り込むことが出来た。

MagicaVoxelで作成したモデルをUE4で利用する (1) 導入編

はじめに

 当ブログの現状のメインコインテンツ(?)であるMagicaVoxelで作ったモデルをUE4に持っていくワークフローの研究がようやく一定の成果を上げられたので、数回に分けて公開していこうと思う。目標は以下の通り。

  • MagicaVoxelでStaticMesh用モデルを作成してUE4にFBXとしてインポートする。条件はモバイル開発でも問題なく使えるように極力頂点数を減らす、取り回ししやすいようにUVテクスチャを作成する。

  • MagicaVoxelでSkeletalMesh用モデルを作成してBlenderでボーンを入れ、アニメーションを付ける。これをUE4にインポートし動かす。

 私はBlenderについては超がつく初心者の為、特にアニメーション周りは非効率な手法を使っている自覚がある。他に良い方法があればTwitterやコメントで教えていただけると助かります。

この記事の対象者

  • UE4でMagicavoxelで作ったボクセルモデルを使いたい

  • BlenderでMagicavoxelで作ったボクセルモデルをアニメーションさせたい

  • MagicaVoxelで作成したモデルにMinecraft風のカクカクしたアニメーションをつけたい。

 この記事はUnityユーザーを対象としていません。が、これから紹介する手法は、かなり変わった、自分が調べた範囲では日本語ブログで一切紹介されていない手法の為、もしかしたら何かの参考になるかも知れない。VRChatでボクセルモデルを動かしたいだけの方はそれについて書かれた専門の記事を読まれることを推奨する。

完成形

 Blender上でアニメーションさせている画面。

f:id:ai_gaminglife:20180606002119g:plain

必要ソフト

 StaticMeshとして書き出す際もBlenderを通す事を推奨。

  • Qubicle

 このワークフローの肝。Steamで2000円程度で購入可能。

  • Qubicle Mesh Module

 Qubicleの有料DLC。2480円。詳細は後述。

MagicaVoxel -> Blender -> UE4 の問題点

 当記事ではすでにQubicleを使わないこのワークフローを色々実験している。色々試しはしたが、UE4でボクセルモデルを使うのであれば、この手法はおすすめしない。詳細は省くが理由は以下の通り。

  • MagicaVoxelのobjエクスポートは頂点色を取ってマテリアルを作成する。UVテクスチャが生成されないので取扱いが面倒。

  • 複雑なモデルをobjエクスポートすると頂点数が爆発的に増える。

  • plyエクスポート -> Blenderで頂点数削減 + UV展開して頂点色を焼き込むという手法があるが、テクスチャ矩形がズレ、正しいマテリアルを生成出来ない。

Qubicleについて

 これらの問題を解決するのがQubicleとQubicle Mesh Module。このソフトはMagicaVoxelと双璧を成すボクセルモデリングソフトで、こちらを使って開発されたゲームも存在する。

cgworld.jp

 しかしながら、個人の感想であるがQubicleは使いにくい。MagicaVoxelより制作できるモデルのサイズが大きいという利点もあるがそれを差し置いてもMagicaVoxelでモデリングする事をおすすめする。幸いMagicaVoxelとQubicle間のやり取りは容易なのでここで心配する必要はない。

 QubicleとMagicaVoxelの差異についてはこちらの記事が詳しい。

imoue.hatenablog.com

 で、Qubicleを使う理由だが、Mesh Moduleを導入することで

  • 自動でズレのないUV展開、テクスチャ生成までやってくれる。

  • MagicaVoxelのobjエクスポート以上に頂点数を減らしてFBX or objエクスポート出来る

  • ボクセルモデルを腕、頭、体、足……と切り分けることが出来る。(Qubicle標準機能)これを使うことで更に頂点数を減らすことが出来る。

 というわけでMagicaVoxelで作ったモデルをQubicleで調整し、Blenderで更に調整するとより使い勝手のよいモデルを作れる。

 次回はStaticMesh用にUE4に書き出す手法を紹介する。

 続き

ai-gaminglife.hatenablog.com

某イベントでUE4を使ったVRタワーディフェンスゲームを作った話

 某ハッカソンイベントでVRゲームを作った。一人で。

 今思うといくらUnity触りたくなくてもせっかくイベントに参加したんだからチームに参加して開発すればよかったかなあと反省している。

 OculusやViveの貸出もあったみたいですが、わざわざ深夜バスでWindows MRを持ってきたのでUE4で無理やりWinMR開発した。といってもWindows Mixed Reality for SteamVR を使って無理やり動かしただけだが……

 作ってる最中は深夜テンションでなかなか良いものが出来たなーと思っていたのだが、落ち着いてプレイし直すと何だこのク○バランスゲームは……と衝撃を受けた。

  • 移動が面倒。VRテンプレートそのままの移動方法を採用したが頻繁に動き回るゲームでこれはひどい

  • UIが雑。もっと丁寧に作るべきだった。

  • 剣の当たり判定がザル。当たったときのエフェクトもないし爽快感も足りない。変な当たり方をして敵を倒すと興が削がれる。

 上げるとキリがない。まあVR開発が実質初めて×一人作業×睡眠時間極短だったことを思うとまあこんなもんかなーとも思う。

 ところでUE4上でWinMRを使用するとサムスティックの入力が入らなかったのだがこれは仕様なのだろうか?


 即興開発ではあったが色々知見は溜まったので、色々為になった知識は後でブログに纏めます。

Siv3DとC++と近況と

 プログラマー志望なのにUE4のBPに頼り切りでほとんどコーディングしないのは如何なものかなーと思い最近時間が空いた時はC++ポケットリファレンスを読むようにしている。で、そろそろ何かC++で作りたいなーでもいきなりDirectX/OpenGL直で触るのはハードル高いなーと考えていた所TwitterでSiv3Dを紹介して頂いた。

play-siv3d.hateblo.jp

 CライクなDXライブラリと違いModern C++で書け、複雑なインタラクションをとても短いコードで書くことが出来るらしい。サンプルプログラムをざっと見た感じProcessingより難しい作りだがゲーム制作に特化されていると印象を受けた。これは今の自分の実力とやりたいことにマッチしていると感じたため、UE4での開発と並行してコレを使ってなんか作ろうと決めた。

 早速リファレンスに従いDL。VS2015にも認識されてサンプルプロブラムをビルドしよう、としたら失敗した。正確に言うとビルドは成功するが実行が出来なかった。「Siv3D Engine」のロゴは表示されるのだがウインドウがすぐに消えてしまう。

 Twitterでライブラリの開発者に質問した所これは珍しいバグでGPUが悪さしているのでは、と教えていただいた。パソコンの製造元にもメールで問い合わせたがこちらもGPUが悪い、ドライバが壊れているんじゃ(他社の製品でのバグは知ったこっちゃねぇと突き放されたが)と返信があった。

 結局Intel GraphicsとNVIDIAのドライバを両方再インストールすることで解決したのだが、これも2度のパソコン自体の初期化やら複数回に渡るドライバのクリーンインストールの末になんか知らない間に解決していたので結局何が悪さしてたのかはわからず仕舞い。とりあえず同じ現象に見舞われた人はドライバの再インストールから始めることをオススメする。

 上記の問題解決に1週間くらいかかった為解決した頃にはモチベが死に絶えていた、更に例のボクセルモデルをBlender上手くでアニメーションさせるアイデアが浮かんだこともあり暫くSiv3Dは触っていなかった。試行錯誤の末ボクセルモデルをアニメーションさせることが出来た(この詳細は来月中にブログにまとめる予定)のでつい三日前くらいから本格的にSiv3Dエンジンを触り始めた。

 今はとりあえずGUI周りを勉強中。こちらの記事 で紹介されているスピンボックスを改造してTextField + GUISliderのクラスを作った。

f:id:ai_gaminglife:20180530145356p:plain

# include <Siv3D.hpp>

//Text + TextField + Slider Class

template<typename T>
class TextSliderGUI
{
public:
    TextSliderGUI(T _value, T _min, T _max)
        :value(_value),min(_min), max(_max) {}

    using TagPtr = std::shared_ptr<s3d::GUIText>;
    using TextFieldPtr = std::shared_ptr<s3d::GUITextField>;
    using SliderPtr = std::shared_ptr<s3d::GUISlider>;

    T value;
    T min, max;
    s3d::String name;
    TagPtr tag;
    TextFieldPtr textField;
    SliderPtr slider;

private:
    //初期化
    void InitWidget()
    {
        {
            textField = std::make_shared<s3d::GUITextField>();
            textField->m_style.width = 56;
            textField->setMaxLength(5);
            textField->setText(s3d::Format(value));
        }
        {
            slider = std::make_shared<s3d::GUISlider>();
            slider->setLeftValue(min);
            slider->setRightValue(max);
            slider->setSliderWidth(max);
            slider->setSliderPosition(value);
        }

    }
    //GUIに登録する

public:

    void LinkGUI(const s3d::String& _name, s3d::GUI& _gui)
    {
        InitWidget();

        const bool linkOK = (textField != nullptr) && (slider != nullptr);
        if (linkOK)
        {
            _gui.add(s3d::GUIText::Create(_name));
            _gui.add(textField);
            _gui.addln(slider);
        }

    }
    //TextFieldの入力を終了したか
    bool InputComplete() const
    {
        return textField->hasChanged && (!textField->getActive());
    }

    void TextUpdate()
    {
        const auto currentVal = s3d::FromStringOpt<T>(textField->getText());
        if (currentVal)
        {
            if(currentVal >= min && currentVal <= max)  {this->value = *currentVal;}
            else                                      { textField->setText(s3d::Format(value)); }
        }
        else
        {
            textField->setText(s3d::Format(value));
        }
    }

    void SliderUpdate()
    {
        this->slider->setSliderPosition(Parse<double>(this->textField->getText()));
    }

    void readText()
    {
        if (textField->getActive() && Input::MouseL.clicked)
        {
            if (!textField->mouseOver)
            {
                TextUpdate();
                return;
            }
        }

        if (InputComplete())
        {
            TextUpdate();
            SliderUpdate();
        }

        return;
    }

    //ウィジェット更新
    void update() {
        assert(textField);
        assert(slider);
        if (slider->hasChanged)
        {
            this->textField->setText(Format(this->slider->_get_sliderPosition()));
        }
        readText();
    }

};

void Main()
{
    GUI gui(GUIStyle::Default);
    gui.setTitle(L"テスト");

    TextSliderGUI<uint32> ts_r(0, 0, 255);
    TextSliderGUI<uint32> ts_g(0, 0, 255);
    TextSliderGUI<uint32> ts_b(0, 0, 255);

    ts_r.LinkGUI(L"R", gui);
    ts_g.LinkGUI(L"G", gui);
    ts_b.LinkGUI(L"B", gui);

    while (System::Update())
    {
        ts_r.update();
        ts_g.update();
        ts_b.update();

    }

}

 templateだのスマートポインタだの使っているが正直な所何もわからず使っている。(だって元のコードで使ってるから……)それに実装にも気に食わない所があって特にmain関数内でupdate()を個別に三回呼ぶ所が気に食わない。std::vectorに格納して範囲for文でぶん回せばいいのかなーと思いつつ、しかし、自作テンプレートクラスをコンテナに格納する方法がわからず投げた。C++ほんとわからん。

 そうこう言いつつこれだけの機能を初学者でもあっさり1日程度(元になるコードを改造したに過ぎないが……)で実装できるのは素晴らしい。暫くはUE4VR開発も含め)とBlenderとSiv3Dをメインで触っていこうと思う。

 そんなことを考えていたら某社のインターン採用通知が届いた。Unityを使うようなので8月までにUnityを最低限使えるようにならなくてはいけなくなった。時間がほしい。

(5/31追記)一応vector使った方法でmain関数書き換えた。こんなものを当てにしてはいけない。

const String RGBTag(int i) 
{
    switch (i) {
    case 0:  return L"R";
    case 1: return L"G";
    case 2: return L"B";
    default: return L"Error";
    }
}
void Main()
{
    using TS_RGB =  TextSliderGUI<uint32>;

    GUI gui(GUIStyle::Default);
    gui.setTitle(L"テスト");

    std::vector<TS_RGB> vec_ts;

    for (int i = 0; i < 3; i++)
    {
        vec_ts.emplace_back(0, 0, 255);
        vec_ts[i].LinkGUI(RGBTag(i), gui);
    }

    while (System::Update())
    {
        for (auto& v : vec_ts)   {v.update();}
    }

}

MagicaVoxelで作成したモデルをBlenderでリギングしたい(個人用メモ)

 前回記事でStatic MeshをUE4に持っていく方法は確立できたがボーンを入れてアニメーションを付けるところまではまだできていない。いろいろ実験してみたので今回はそのメモ。

ai-gaminglife.hatenablog.com

QubicleのOptimizationオプションについて

 ボクセルで制作したモデルをplyで書き出してからBlenderでfbxとして書き出すとUVテクスチャがない、頂点、ポリゴン数が莫大に増えるといった問題がある。

 そこで、Qubicleの有料DLC、「Mesh Module」を購入することで自動でUV展開したテクスチャを得ることができ、更にボクセルモデルを自動で最適化し、ポリゴン数を大幅に減らすことができる。

f:id:ai_gaminglife:20180516175718p:plain

 file -> export -> fbx でexport時のオプションを設定できる。最適化に関わるのは "Optimization" のところ。"None"、"Non-Manifold"、"Manifold"の3つの選択肢がある。

 "None" は目に見えない部分の頂点が削除される。これはBlenderの重複頂点を削除でも出来るのでテクスチャを得る以外の目的で使うことはなさそう。

 "Non-Manifold"は最もポリゴン数を減らすことができる。しかし、このオプションは形によって、"not watertight"、水密にならないのが問題。つまり一部の辺が画像のようにつながらなかったりする。一切形を変更しないStaticMeshであればこれでも問題はないが、ボーンを入れてアニメーションさせるSkeletalMeshとして使用するとつながっていない辺が裂かれてしまい問題。

 "Manifold" は "Non-Manifold" より多くのポリゴンを必要とするが、 "Non-Manifold" で問題であった非水密性が解決できる。

 というわけでMagicaVoxelで作成したStaticMesh用のモデルは基本的に "Non-Manifold" 最適化をかければいい。SkeletalMesh用のモデルは "Manifold" を使う…と言いたいところだが話はそんなに単純ではない。詳細は次に。

参考サイト http://minddesk.com/learn/article.php?id=18 http://minddesk.com/learn/article.php?id=30

各手法で作ったモデルをMixamoでリグ付けしてアニメーションさせてみる

 MagicaVoxelで作ったモデルをBlenderでボーンを入れられるようにするには大きく分けて以下の方法が考えられる。

  1. MagicaVoxelでply形式でexport
  2. Magicavoxelでobj形式としてexport
  3. qb形式で書き出した後"Non-Manifold"最適化をかけてfbx or obj形式でexport
  4. qb形式で書き出した後"Manifold"最適化をかけてfbx or obj形式でexport

 1は色を頂点カラーとして保持しているためゲームエンジンで利用するためにUVテクスチャに頂点カラーをベイクしたい。しかし、標準のBlenderではどうしてもズレてしまうのは過去記事を見ていただけるとわかるはず。

 2はパレットカラーをテクスチャとして持っている。しかしできることならUV展開したテクスチャを持ちたい。

 3は前述の通り水密性が保たれておらず、ボーンを入れ変形させると境目で裂けてしまう。

 で本命の4。これが一番良さそうに見えるのだが、ボクセルらしいアニメーションを得られない。四角形で形成されるボクセルモデルを三角ポリゴンに分けているからだ。しかもボクセルで作ったモデルの関節をボーンで無理やり曲げることで明らかに違和感のあるアニメーションになってしまう。

 こんな感じでどの方法もコレといった解決方法にはなっていないがものは試し。ブラウザ上で気軽にリグ付けできるAdobeのサービス、Mixamoを使ってアニメーションさせてみる。(3は試すまでもなくダメなので省略、1は事情により省略)

「Magicavoxelでobj形式としてexport」した場合

「qb形式で書き出した後"Manifold"最適化をかけてfbx or obj形式でexport」

 ぱっと見、「Magicavoxelでobj形式としてexport」が一番それらしい動きになっている。しかしコレではまだ納得できない……

考えられる解決方法

 Twitterで権田支配人(@GONDAman555)さんに教えてもらった方法がQubicleでモデルを分割するというもの。こうすれば違和感ないアニメーションが作れるかも……?しかしBlenderがワカラナイ()のでまだ実際には出来ていない。

おまけ

 現在Qubicleでパーツごとに分割してAutoRigProを使ってリグ付けしようとしている。AutoRigProはBlendファイルをUE4に書き出すのに優れたアドインの一つらしく、コレでうまくいけばUE4上でのリターゲットも容易にできそう。しかし例によってBlenderワカラナイのでドキュメントや解説動画とにらめっこしながら格闘中……

MagicaVoxelで作成した3DモデルをUE4に持っていく方法・完結編(Qubicle使用)

 とうとうMagicaVoxelで制作したモデルをUE4に上手く書き出す方法がわかったのでまとめ。過去記事は以下の通り。

ai-gaminglife.hatenablog.com

ai-gaminglife.hatenablog.com

ai-gaminglife.hatenablog.com

 今回はSteamで販売されている「Qubicle」(1980円)とその追加DLC、「Qubicle Mesh Module」(2480円)を使用する。Qubicleを通して書き出しすることで頂点を減らし更にUV展開したテクスチャも得る事ができます。神ツール!

MagicaVoxelで作成したモデルをQubicleに持っていき調整

f:id:ai_gaminglife:20180516175650p:plain

 今回はMagicaVoxelでこのモデルをUE4に持っていく。Export形式は「qb」。これはQubicle対応の形式らしい。

 続いてQubicleを起動。先程書き出したqbファイルを選択しロード。

f:id:ai_gaminglife:20180516175701p:plain

 Transformから 「Flip Z」を選択してZ軸を反転させる。モデルの中心がずれているので MagicaVoxelでの中心とQubicleエディタ上の座標原点を揃える。

f:id:ai_gaminglife:20180516175710p:plain

 File -> Exportから FBXを選択。下画像の様な設定画面が出るので画像の様に設定する。「Unit Scale Factor」を変更するとモデルの大きさを変えることが出来る。

 これでFBXファイルとして書き出し完了。

f:id:ai_gaminglife:20180516175718p:plain

(必要な場合は)Blenderで調整する

 ボーンを入れる必要があるときなど調整が必要な場合はBlenderを一度通す必要がある。というわけでBlenderを起動。いつものように最初に配置されている立方体を削除し、先程作成したFBXファイルをインポートする。

 シェーディングをマテリアルに変更し、モデル全体に光が当たるようにライトを配置する。

f:id:ai_gaminglife:20180516175725p:plain

 見ての通りテクスチャがボケてしまっている。これはユーザー設定 → システムのミップマップのチェックボックスを外すことで解決する。

f:id:ai_gaminglife:20180516175736j:plain f:id:ai_gaminglife:20180516175745p:plain

 これで問題なくモデルにボーンを入れられるようになった。この辺りはまたいずれブログにまとめる。

 調整が終わったらFBXとしてexport。これでUE4に持っていくまでの調整は終了。

FBXをUE4にインポートする

 FBXをコンテンツブラウザにドラック&ドロップでインポート。特に設定はいじる必要なし。

 これで全ての作業完了…と言いたいところだがモデルを見てみるとテクスチャがボケボケ&色が一部滲んでいる。

f:id:ai_gaminglife:20180516175823p:plain

 これはUE4のテクスチャのデフォルト設定が問題。というわけでテクスチャファイルを開き、以下のように設定する。

  • Comression -> Compression Settingsを 「UserInterface2D」に変更する

  • Level of Detail -> Texture Groupを 「2D Pixels」に変更する

  • Texture -> Filterを 「Nearest」に変更する

 これでMagicaVoxelでの色そのままにモデルをUE4に持っていくことが出来た。

f:id:ai_gaminglife:20180516175836p:plain

 以上、時間は掛かったがほぼ理想通りにボクセルモデルをUE4に持っていくことが出来た。

 

UE4超初心者向けチュートリアルスライド(2)を公開しました

ai-gaminglife.hatenablog.com

 前回は想像以上の方に見ていただけたようでありがとうございます。サークルの第一回集会も個人的には上手くできたと思っているので、第二弾を作成しました。

 今回は

  • プレイヤーの攻撃の簡易実装
  • 敵キャラ、敵AIの実装
  • 敵のスポーン管理

を取り扱っています。二回分やっていただければ、ざっくりとしたUE4の使い方、そしてUE4の良さがわかってもらえると思います。

また、今回はalweiさんのこちらの記事をかなり参考にさせていただいております。毎度有益な記事を書いていただき本当にありがとうございます!

unrealengine.hatenablog.com    例によりSlideshare版は画質劣化が認められますので見づらい場合はこちらでスライドをダウンロードしておいて下さい。

https://drive.google.com/open?id=1m2l15N1dPxDpPCwRrfQgeM0aOjsg_94X