AR年賀状を作ってみた (glTFモデル表示編)
こんにちは。
前回の続きで、アニメーション付きの3DモデルをA-frame で表示するために色々やってみました。
記事の一番後ろには色々チャレンジして失敗したことをまとめました。(解決していないのでどなたか教えていただけると嬉しいです・・・)
前回の記事はこちら。
kabos.hatenablog.jp
glTFを使う
glTFとは、3D界でのjpegを目指して作られたファイルフォーマットだそうです。
結論から言うと、glTFを使うとアニメーション付きの3DモデルをA-frameで表示できました。
やり方は簡単で、
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>AnimationTest</title> </head> <body style="margin:0px; overflow:hidden;"> <!-- ライブラリの読み込み --> <script src="https://aframe.io/releases/0.7.1/aframe.min.js"></script> <script src="https://jeromeetienne.github.io/AR.js/aframe/build/aframe-ar.js"></script> <script src="js/aframe-extras.js"></script> <script src="js/aframe-text-geometry-component.min.js"></script> <a-scene embedded arjs="debugUIEnabled:false;" vr-mode-ui="enabled: false"> <a-assets> <a-asset-item id="aniBox" src="BoxAnimated/BoxAnimated.gltf"></a-asset-item> </a-assets> <a-marker preset="hiro"> <a-entity gltf-model="#aniBox" rotation="-90 0 0" position="0 0.5 0" animation-mixer="clip:*" ></a-entity> </a-marker> <a-entity camera></a-entity> </a-scene> </body> </html>
と書くだけ。
ドキュメントの推奨フォーマットにglTFって書いてあるんだから最初からこれを使えばよかったです・・・。
こんな感じで動きます。
Robert MarkさんのBox animated glTF stag という作品をお借りしました。https://t.co/HAQ6xjVY33 pic.twitter.com/mBl9a1FEGq
— すだち (@kabostrawberry) December 11, 2018
ちなみに、こちらの3Dモデルは、Robert MarkさんのBox animated glTF stagという作品をお借りしました。
glTFモデルについて
この次の節でglTFモデルの作り方について説明しますがその前に。
とりあえずglTFモデルでテストしたい!という方にはグーグルのPolyというサイトをオススメします。
こちらにアップロードされている3Dモデルの多くはglTF形式でダウンロードすることができ、CC-BYライセンスにのっとって使用することができます。
CC-BYライセンスとは、>>
原作者のクレジット(氏名、作品タイトルなど)を表示することを主な条件とし、改変はもちろん、営利目的での二次利用も許可される最も自由度の高いCCライセンス。
(クリエイティブ・コモンズ・ライセンスとは | クリエイティブ・コモンズ・ジャパン より)<<の事だそうです。
アニメーション無し人型3Dモデルの作成
ここでは、アニメーション無しの3DモデルをglTFファイルにする方法を説明します。動いて欲しい方は次の項をご覧下さい。
大きく分けて4種類方法があります。
VRMモデルを使う
VRMとは、VR向けの人型アバターフォーマットです。ドワンゴさんのGitHubに詳しく載っています。
これが一番手間が省けて最強の方法です。(VRMが用意されているモデルを使うなら、ですが)
例えば、前回MMDモデルを利用したアリシアちゃんのモデルは、こちらに公式で用意されています。他にも、ニコニ立体内で検索すると、色々見つかると思います。但し、今回のような場合は、利用規約に再配布可能と記載されているモデルを使用しなければなりません。
やり方としては、拡張子を.vrmから.gltfに変更するだけです。これで表示できます。
UniGLTFを使う
unityからglTFを出力できないのかな〜と調べていて見つけたのがこの方法です。
まず、こちらからUniVRM~~.unitypackageをダウンロードします。すると、UniGLTFもセットでダウンロードできます。このunitypackageをD&Dすることでimportします。
あとは、空のオプジェクトを作成し、exportしたいオブジェクトをその子にして、UniGLTF > Export で完了です。
詳しくはこちらに載っています。
Sketchfabを使う
Sketchfabとは、3Dモデルを簡単に共有できるサイトなのですが、なんと、unityから簡単にアップロードしてglTFでダウンロードすることができます。
やり方としては、まずSketchfabに会員登録します。
次に、アセットストアからSketchfab for Unityをダウンロードします。そしてアップロードしたいオブジェクトを選択して、Sketchfab > Publish to Sketchfab から、export selection にチェックを入れてアップロードします。
アップロードできたら、自分のページのModels からアップロードしたモデルを選択し、MANAGE THIS MODELから設定を変更してダウンロード可能にします。
設定が変更できたらダウンロードボタンが出現するので、そこからglTFを選択してダウンロードしましょう。
アニメーション付き人型3Dモデルの作成
Mixamo の利用
今回は、Mixamoというサイトを利用します。このサイトでは、モデルをアップロードするとボーンをつけてくれて、しかもそれに合わせたアニメーションをダウンロードできます!
ちなみに、配布されている3Dモデル(アリシアちゃんやプロ生ちゃん)のfbxモデルは元々ボーンが入っているのですが、一旦objに変換してサイトでボーンを付け直した方が良いです。ダウンロードしたアニメーションのボーンとサイズが合わなくて困ったりしたので。
ではまず会員登録をします。Adobe のIDを持っている方はそれでログインできます。
ログインできたら、BROWSE ANIMATIONSをクリックします。すると、アニメーションがたくさん出てきますが、まずは3Dモデルをアップロードします。
右側にあるUPLOAD CHARACTER をクリックし、objファイルとテクスチャをzipに圧縮した物をアップロードします。
するとボーンを設定する画面になるので、指示に従って設定します。ここでなぜかテクスチャが表示されないことがあるのですが、表示されていないだけでちゃんと存在している(はず)なので大丈夫です。
設定が完了したら、アニメーションを何も選択しない状態でDOWNLOAD をクリックします。
するとボーンの入った3Dモデルがダウンロードできます。
次に、好きなアニメーションを選択してDOWNLOAD をクリックします。
写真のような設定にして、ダウンロードします。
ここまでできたら、ダウンロードしたfbxファイルをBlenderにimport します。
Blender にimport
import する時の画面の左下の設定は次のようにしておきます。
Main > Manual Orientation にチェックを入れる
Armatures > Automatic Bone Orientation にチェックを入れる
ここで、モデルをimport した時にめちゃくちゃ小さくなっていて見えなくなっていることがあるので、もし無いと思ったら拡大して探してください(ただしここではまだモデルの大きさは変えない方が良いです)。ひっくり返っていることもあったので、その場合は修正してください。また、テクスチャが表示されていない場合は、Material モードにすると表示されることがあります。
モデルをimport できたらアニメーションも先ほどの設定でimport します。
無事にimport できたら、アニメーションの確認をします。画面を2つに増やし、左下のボタンからDope Sheet に変更します。そしてAction Editor に変更します。(こちらの4にあるGIFがわかりやすいです)
右上のパネルで3Dモデルを選択し、Action Editor の右のボタンからimport したアニメーションを選択して下にある再生ボタンを押します。
そして3Dモデルが動いたらOKです!
最後に、サイズが小さすぎた場合はここで調整しておきます。
Blender からexport
いよいよexport です。
まず、Blender の公式プラグインである、glTF エクスポーターを入れます。
Clone or download からダウンロードして、その中にある、scripts > addons > io_scene_gltf2 というフォルダをBlenderのアドオンフォルダの中に移します。
次に、Blender を開いて、File > User Preferences からAdd-onsのタブを選択します。
検索窓にglTFと入力し、チェックを入れたら完了です。
設定ができたら、Export の選択肢にglTFが出現するようになるので、glTFを選んでexport します。
上手くできているか確認
glTF Viewer というサイトがあるので、ここにglTF(glb)ファイルをD&Dすると正しくexport できているか確認できます。
ここで上手く表示されなかったら、次の「Unityに移してexportする方法」を試してみてください。
ARで表示
前回も書きましたが一応。
index.html と作成した3Dモデル(ここでは例としてAlicia.glb)が入ったフォルダを用意します。
index.html には次のように書きます。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>AliciaAnimation</title> </head> <body style="margin:0px; overflow:hidden;"> <!-- ライブラリの読み込み --> <script src="https://aframe.io/releases/0.7.1/aframe.min.js"></script> <script src="https://jeromeetienne.github.io/AR.js/aframe/build/aframe-ar.js"></script> <script src="js/aframe-extras.js"></script> <script src="js/aframe-text-geometry-component.min.js"></script> <a-scene embedded arjs="debugUIEnabled:false;" vr-mode-ui="enabled: false"> <a-assets> <a-asset-item id="Alicia" src="Alicia.glb"></a-asset-item> </a-assets> <a-marker preset="hiro"> <a-entity gltf-model="#Alicia" rotation="0 180 0" position="0 0.5 0" scale="0.8 0.8 0.8" animation-mixer="clip:*" ></a-entity> </a-marker> <a-entity camera></a-entity> </a-scene> </body> </html>
そして、フォルダをzipで圧縮して、Netlify Drop にD&DすればOKです!
生成されたリンクの先頭にhttps:// をつけてスマホで開いてみましょう。
この時、カメラへのアクセスを要求されるのですが、なぜかそれが表示されるまで少しかかります。
失敗したこと
glTFモデルをARで表示する
まずは、公式ドキュメントの3Dモデルに関するところを読んでみました。
すると、animation-mixer component というものを使うと書いてあるように思えたので、使ってみることにしました。
しかし、fbxモデルがなぜか表示されず・・・例の通りにjsonファイルでないとダメなのかと思い、jsonファイルに変換することにしました。
ところがここでまた問題が発生します。fbxをjsonに変換する方法を調べると、blenderにthree.js のjson変換用プラグインを入れると書いてあるのですが、そのプラグインが置いてあるはずの場所に飛ぶと、今後のために廃止(?)したというお知らせが・・・。今後はloader を使えと書いてあったのですがあまりよくわからず諦め。
最後にオンラインでのコンバーターを見つけたのでやっとの思いでjsonファイルに変換したのですが、結局これもなぜか表示されませんでした。
アニメーション付き人型glTFモデルの作成
- UniGLTFでアニメーションを出力できない
こちらにアニメーションのエクスポートについて説明されていたので何度か挑戦してみたのですが上手くいきませんでした・・・。
手順に書いてある「このクリップに対してアニメーションキーを追加」の意味がよく分からなかったのが原因だと思います。調べても分からなかった・・・。
- unityで作ったアニメーションをBlenderに持っていけない
unityでアニメーションをつけることとBlenderでアニメーションをつけることがどうも違うことのような気がしたので、unityで作ったアニメーションをBlenderに持って行こうとしたのですが上手くいきませんでした。
参考記事
A-frame公式GitHub
aframe-extras/src/loaders at master · n5ro/aframe-extras · GitHub
animation-controls/index.html at master · rexraptor08/animation-controls · GitHub
aframe-extras/src/loaders at master · n5ro/aframe-extras · GitHub
glTF
BlenderでFBX形式をglTF形式に変換してThree.jsでアニメーションさせる (1/2) | RYO620 DESIGN & DEVELOPMENT
glTF-Blender-Exporter/scripts at master · KhronosGroup/glTF-Blender-Exporter · GitHub
【WebGL特集】第8回:各ツールからglTF形式でアニメーション出力|3DCGアニメーションを手付けモーションでより魅力的に。株式会社モックス
glTF Viewer
Creating animated glTF Characters with Mixamo and Blender
Blender から GLTF を出し、 Three.js で使うまでの覚書 (アニメーション編1、ずん子さん編) - Qiita
- 作者:Khronos Group
- 発売日: 2019/02/08
- メディア: ペーパーバック