MRが楽しい

MRやVRについて学習したことを書き残す

UnityにMMDのダンスモーションを取り込んでモーションとして利用する(その5)

前回記事の続きとなります。
bluebirdofoz.hatenablog.com

MMDのダンスモーションをUnityに取り込むのは諦めた。といいつつ、やはり諦めきれない自分。
以前、導入を保留したMMD4Mecanimならどうだろうかと考えました。
bluebirdofoz.hatenablog.com

新規プロジェクトを作成して、ダンスモーションの取り込みがどうなるか試してみます。
f:id:bluebirdofoz:20170710010712j:plain

MMD4Mecanimのインストール手順の詳細は以下ページのマニュアルを参照します。
・Stereoarts Homepage
 http://stereoarts.jp/

MMDモデルの変換処理を行う際に、VMDファイルを追加して変換します。
f:id:bluebirdofoz:20170710010737j:plain

変換完了。モデルとモーションが出力されています。Rigはこの時点でGenericに設定されていますね。
f:id:bluebirdofoz:20170710010747j:plain

この時点のモーションファイルを確認するとスムーズに動いています。
f:id:bluebirdofoz:20170710011118j:plain
ダンスも破綻しておらず、線形補完の問題は自動で対処していようです。

さて、共有のチェックです。まず、この時点のモーションをユニティちゃんのモーションに設定してみます。
f:id:bluebirdofoz:20170710010850j:plain

結果、妙な姿勢になったまま固まりました。共有失敗です。
f:id:bluebirdofoz:20170710010859j:plain
取り込んだMMDモデルがモデル固有のGenericボーンの状態なので当然ですね。

では、RigをHumanoidに変更してみます。
f:id:bluebirdofoz:20170710011141j:plain
それっぽく自動設定されました。……が、やはりこの時点で例の下半身ボーンが変な伸び方をしてますね。

改めてモーションを動作確認。前回、確認した下半身が動かない事象が再現しました。
f:id:bluebirdofoz:20170710011155j:plain

ユニティちゃんに反映してみると、それなりは動くようになりましたが、やはり下半身だけが正常にモーションしません。
f:id:bluebirdofoz:20170710011206j:plain


結論としてMMD4Mecanimでも、MMDボーン構造からUnityのHuman mecanimボーン構造の変換は完全には提供できていないようでした。
実を言うと、以下ページのマニュアルでしっかりとHumanoidではVMDの再現性は下がりますと言及されています。
・Stereoarts Homepage
 http://stereoarts.jp/

やはりMMDモデル取り込みにおいては、この下半身ボーンの相違が最大のネックのようです。
とはいえ、このツール、Generic設定時のダンスモーションの再現度については非常に素晴らしいです。
何の微調整も必要なくスムーズなダンスモーションが再生されるため、MMDファイルのFBX変換ツールとしてかなり優秀です。

キャラクタを追加し、GooglePlayから曲を購入してプロジェクトを作成してみました。
f:id:bluebirdofoz:20170710012017j:plain
hololensで体感するとどういった感想を抱くか非常に興味深いですが、家の中では狭くて上手く見れませんのでhololensでのMMDダンス体験はまた今度です。
しかし結局、既存ツールを使うのが手っ取り早いというのはちょっぴり悲しい。

UnityにMMDのダンスモーションを取り込んでモーションとして利用する(その4)

前回記事の続きとなります。
bluebirdofoz.hatenablog.com

Unityに取り込んだダンスモーションをユニティちゃんのモーションとして利用してみます。
f:id:bluebirdofoz:20170709042811j:plain
ちゃんと流用できています。ただ、微妙に動きがおかしいところがあります。

まずMMD for Unityの説明にあった「UnityとMikuMikuDanceでは線形補間の方法が異なる」のが原因と考えました。
MMD for Unityの使い方
 https://mmd-for-unity-proj.github.io/mmd-for-unity/howto.html
もしそうならば、線形補完をBlender上でやればよい訳です。

幸い、Blenderではモーションはおかしくなっていないので、この問題はBlender上でキーフレームを増やすことで解決できます。
ファイルサイズも増えますが、モデル自体に比べれば小さいです。

しかし自動で行う方法が分からなかったのでUWSCを使って全てのキーフレームを半自動の手動設定を行いました。
f:id:bluebirdofoz:20170709042844j:plain
以下、UWSCの実行プログラムです。キーボード操作とマウス操作で等間隔にキーフレームを打ちこみます。

MMV(1120,500,100)
CNT = 1
WHILE CNT < 324
 KBD(VK_RIGHT,CLICK,100)
 KBD(VK_RIGHT,CLICK,100)
 KBD(VK_RIGHT,CLICK,100)
 KBD(VK_RIGHT,CLICK,100)
 KBD(VK_RIGHT,CLICK,100)
 KBD(VK_RIGHT,CLICK,100)
 KBD(VK_RIGHT,CLICK,100)
 KBD(VK_RIGHT,CLICK,100)
 KBD(VK_RIGHT,CLICK,100)
 KBD(VK_RIGHT,CLICK,100)
 SLEEP(0.1)
 KBD(VK_I,CLICK,100)
 SLEEP(0.1)
 BTN(LEFT,CLICK,1120,500,100)
 CNT = CNT + 1
WEND

もはや力技です。私自身の疲労の色が伺え始めます。


しかし更に問題が。モーションをよくみると、下半身の部分が動いていませんでした。
これはダンスモーションのキーフレームが「下半身」ボーンに割り当てられているのに、Unityのhuman mecanimの下半身認識は「腰」ボーンで行われているためです。
Unityのhuman mecanimの下半身認識を「下半身」ボーンに切り替えます。すると以下のエラーが発生しました。
f:id:bluebirdofoz:20170709042916j:plain
human mecanimでは上半身ボーンの親ボーンは下半身ボーンでないとダメのようです。

確認してみると、mmd_toolsでBlenderに読み込んだモデルは確かに「上半身」ボーンの親が「腰」ボーンになっていました。
どんな影響が出るか、現状ではわかりませんが、「上半身」ボーンの親を「下半身」ボーンに変更します。
f:id:bluebirdofoz:20170709042935j:plain

変更を完了し、改めてFBX形式で出力します。
今度は「下半身」ボーンをちゃんと設定して反映すると……。
f:id:bluebirdofoz:20170709043002j:plain

やはりというか、ダンス時の上半身の動きがおかしくなりました……。
特にターンなどの腰を捻る動きの歪みが酷いことから、ボーンを変更した影響と見られます。
結局のところ、MMDのボーン構造とhuman mecanimのボーン構造に違いがあったと言う事なので、この違いをモーションとして上手くマージする手段が必要です。
f:id:bluebirdofoz:20170709124523j:plain
Rigifyのボーン構造とMMDモデルのボーン構造を比較したところ。下半身部分のボーンが逆方向なのが分かります。
当然ながらMMDのダンスモーションはこの下半身ボーンが下方向である前提でボーンの位置回転キーフレームが設定されている訳です。
流石にこれは一朝一夕の知識と作業では修正対応できません。

今回のところは、BlenderからUnityへのモーション持ち込みについて一通り学ぶことができたのでよしとします。
MMDのダンスモーションをUnityに取り込むのは一旦保留ですね。

UnityにMMDのダンスモーションを取り込んでモーションとして利用する(その3)

前回記事の続きとなります。
bluebirdofoz.hatenablog.com

前回、BlenderでVMDファイルが読み込めなかった問題からです。
いや、実は途中で分かってました。ボーンそのものを差し替えてるんだからモーションが流用できるわけないです。
ダンスモーションとRigifyの連動をどうするかが結局のところ、MMDダンスモーションをUnityに取り込むことに繋がる訳です。

さて、今までのテストから、おそらくダンスモーションはボーンの名前で関連付けが行われていることが分かっています。
ではRigifyで作ったボーンの名称をMMD準拠に修正すればダンスモーションが取り込めるんではないでしょうか。
という訳で、作成したRigifyと大元のMMDモデルのボーンを比較することにしました。
f:id:bluebirdofoz:20170709041850j:plain

しかし、ここでようやく気付きました。あれ?Rigifyのボーン構成とMMDモデルのボーン構成ほとんど同じじゃない?と。
もしボーン構成が同じならUnity側の方で連携が取れれば、それで問題ない訳です。

試しにBlenderにインポートしたMMDモデルをそのままFBX形式に出力してUnityに取り込んでみると……。
f:id:bluebirdofoz:20170709041901j:plain
しっかり動きました。

要は以下のボーンの関連付けで適当なボーンが存在していれば良い訳です。
f:id:bluebirdofoz:20170709041910j:plain
そのまま取り込んだときは手の動きが変でしたが、関連付けを少し修正してやればしっかり動きました。

ならば、ダンスモーションを取り込んだBlenderプロジェクトをFBXで出力してやれば……。
f:id:bluebirdofoz:20170709041921j:plain
Unity上でダンスモーションが確認できました。

回り道をした気がしますが、これでVMDファイルからUnityにモーションデータを取り込むことができました。
しかし、ボーンの関連付けがマズいのか。それっぽい動きはしているものの、所々破綻しています。
次回はこの微調整を詰めていきます。

UnityにMMDのダンスモーションを取り込んでモーションとして利用する(その2)

前回記事の続きとなります。
bluebirdofoz.hatenablog.com

前回、モーション元のキャラクタと背の高さが合っていないため、モーションが微妙にズレていた問題ですが。
ひとまず、モーション元のキャラクタをそのまま引っ張ってきて動きを見てみることにしました。
3d.nicovideo.jp

ボーン修正等除いて、改造は原則禁止の規約の厳しめなモデルですが、Unityへのインポートならボーン変更等の範疇かしら?
確認が完了すれば別モデルに差し替えます。

さて、今回の本題です。
BlenderのアニメーションをUnityに持ち込む方法について確認します。
docs.unity3d.com
www.cho-design-lab.com
gametukurikata.com

なるほど、ここで用意した標準ボーンにモデルを合わせることでUnityで利用可能なモデルを作成し、そこに反映したアニメーションを一緒にUnityへ持っていくという流れのようです。

自作したモデルをUnityに取り込むのはいずれ実施する予定ですが、今はアニメーションを取り込みたいだけです。
わざわざ自作モデルを対応付けする必要はなく、Unityにアニメーションを持ち込むモデルが欲しいだけなのですが……。
公開されているRigify反映済みモデルが見つからない。需要ないのでしょうか。
以下で公開していた形跡は有りますが、既にファイルが見つかりません。
www.youtube.com

とか色々やっていたら、逆にMMDモデルをRigifyに反映することをトライしている記事を発見しました。
takosukegh.github.io

微妙に目的とは異なりますが、気になるので実施してみました。
……が、結果は全く動かず。取っ掛かりもつかめなかったため、諦めました。

もう、手動でやるのが一番手っ取り早い、と下記の手順を実施しました。(しかし、この発想はSEとしてどうなのか)
nn-hokuson.hatenablog.com

途中、エラーが出たので以下で解決。
detail.chiebukuro.yahoo.co.jp
blender.stackexchange.com

そしてFBXに変換して出力してみると……。
f:id:bluebirdofoz:20170709041335j:plain
ちゃんとUnity上で動いきました。やったー。

と、喜んだのもつかの間。次の問題が発生します。
Blender上でモデルへのVMDファイルの反映ができません。
そりゃそうです。だってボーンそのものを差し替えてるんだからMMDのモーションと連動できるわけありません。

Blender->Unityのモーション取り込みはできる訳ですが、MMD->Blender->Unityの流れがきちんとつながっていません。
MMDモーションとの連動方法の調査について、次回へ続きます。

UnityにMMDのダンスモーションを取り込んでモーションとして利用する(その1)

以前、記事でMMDキャラクタの取り込みを行いました。
bluebirdofoz.hatenablog.com

しかしMMDの魅力はキャラクタ配布だけではなく、多彩なダンスモーション配布も魅力の一つです
今回はそのダンスモーションをUnityプロジェクトに読み込んで使ってみます。

キャラクタ同様、配布者ごとに利用規約が異なります。データを取得した際は付属するテキストをよく読みましょう。
今回利用したモーションはこちらです。
seiga.nicovideo.jp

取り込みにはキャラクタ同様、MMD for Unityを利用します。取り込み方は公式ページを参照します。
MMD for Unityの使い方
 https://mmd-for-unity-proj.github.io/mmd-for-unity/howto.html

一部、そのままでは動かなかったので修正。Unityのバージョン変更によるものと思われます。
・VMDInspector.cs

  // エラー発生のため修正
  // pmdPrefab = (GameObject)EditorGUILayout.ObjectField("PMD Prefab", pmdPrefab, typeof(Object), false);
  pmdPrefab = (GameObject)EditorGUILayout.ObjectField("PMD Prefab", pmdPrefab, typeof(GameObject), false);
  vmd_config.OnGUIFunction();

しかし、正常に動作せず。そもそもhuman mecanimに対応していないようで、Animationファイルしか出力しません。
これではUnityちゃんとのモーション共有ができません。


よってMMD for Unityによる取り込みを早々に諦め、他の手段を模索しました。
真っ先に思いついたのはVMD(MMDのダンスモーションフォーマット)をFBX(3D製作ツールの汎用フォーマット)に変換することです。
元々、Blenderで作成した自作モーションをhololensアプリに反映することを考えています。
ならば、MMD->Blender->Unityの流れが実現できるなら、その形でもOKということです。
MMD->Blenderの方法についてはBlenderのアドオンが有志により提供されているのでそれを使います。
github.com
blender.u5kun.com

読み込みの際の注意点ですが、ボーンを全て選択した状態でVMDファイルをインポートする必要があります。
アーマチュアの選択でなく、全てのボーンが選択された以下の状態です。
f:id:bluebirdofoz:20170709035958j:plain
デフォルトだとボーンは非表示なので、アウトライナーから表示すると選択しやすいです。
この状態でインポートすると……。
f:id:bluebirdofoz:20170709040020j:plain
Blenderの中でキャラクタが踊りました!
モーション元のキャラクタと背の高さが合っていないため、ところどころ無理のある姿勢になるところもありますが、Blender上なので講座で勉強したことを元に修正すればよい話です。

ひとまず、MMD->Blenderのモーション取り込みは成功です。
微修正は後からでもできますので、次回はこのBlenderで作成したモーションをUnityのhuman mecanimに適用する方法を調べていきます。

公式チュートリアル「HOLOGRAMS 211 5章」を試してみる

本日はチュートリアルお試し枠の続きとなります。
HOLOGRAMS 211 の最終章 5章を実施します。
いつも通り、以下ブログの記事を参考に実施します。
azure-recipe.kc-cloud.jp


参考記事にある通りにAstronautManager.csのコードを修正します。
アプリを起動します。宇宙飛行士が現れるのはそのままです。
f:id:bluebirdofoz:20170707012825j:plain
「Expand Model」と発声すると……。
f:id:bluebirdofoz:20170707012840j:plain
宇宙飛行士が爆散します。
f:id:bluebirdofoz:20170707012847j:plain
「Rest Model」というと何事もなかったように復活します。

今回のAstronautManager.csの修正は音声認識を追加しただけで、宇宙飛行士の爆散プログラムは予め仕込まれています。
チュートリアルの最後のお遊び的な章ということでしょうか。
Holograms 101の最終章でも似たようなアンダーグラウンドをのぞき込む章がありましたね。

折角なので、モデル爆散の仕組みを見てみました。

結論を言うと、実際に宇宙飛行士のモデルを分解している訳ではなく「AstroMan_Expanded」というバラバラ状態のモデルが別に用意されています。
f:id:bluebirdofoz:20170707012940j:plain
宇宙飛行士のモデルを無効化し、「AstroMan_Expanded」を有効化するとモデルがバラバラになったように見えるという訳です。
f:id:bluebirdofoz:20170707012955j:plain
バラバラになるモーションは「AstroMan_Expanded」の中のゲームオブジェクトがAnimetorコンポーネントを持っています。
これが宇宙飛行士の形からバラバラのパーツに分解するアニメーションを再生します。
f:id:bluebirdofoz:20170707013010j:plain

分かってしまえば単純な仕組みですが、手間はかかってます。
簡単にこういった表現ができる方法があるかと期待したんですが、そんなに甘くないようです。

Blenderで3Dモデルを作成する(かんたん講座編その11)

3Dモデリングの学習枠です。今回はレンダリングです。
・かんたんBlender講座(レンダリング
 http://krlab.info.kochi-tech.ac.jp/kurihara/lecture/cg/BlenderWeb_Hayashi/html/rendering.html

今回、時間がかかりますが、そのほとんどはレンダリングの完了待ち時間です。
色々調整してサイズを落としても、2MBほどの動画作成に30分ほどかかりました。
動画サイトで高画質の3D動画についてレンダリングに2日かかったという話がありましたが納得です。
凝ってる方はレンダリング用PCとか持ってそう。

出力した映像の一部切り抜きがこちら。ほぼ講座そのままではありますが、初のBlenderでの3D動画作品。
f:id:bluebirdofoz:20170706032705g:plain
パッと見イイ感じです。
背景の切れとか気になる点はありますが、再レンダリングするのはまた時間がかかるので止めておきます。
Blender上で「0」キーを押すとカメラ視点での確認ができるので、そこで徹底的に調整してからレンダリングするのが正解です。


さて今回で3Dモデリングのかんたん講座編は終了です。

3Dモデリング→テクスチャ設定→ボーン設定→アニメーション作成→ライティング→レンダリング

これら全ての3D動画の作成手順をBlenderで一通り、実施することができました。
初心者向けの講座ということもあり、説明が丁寧かつ、難易度も丁度良く、とても良い教材でした。

3Dモデリングを始めた理由は「hololensアプリに登場させるオリジナルの3Dキャラクタを登場させる」なので、そこを最終目標に今後も3Dモデリングの学習は継続します。