><=Blenderで出力したUVメッシュ付きobjファイルをA-Frameで読み込む方法 | StartHome
starthome-logo

Blenderで出力したUVメッシュ付きobjファイルをA-Frameで読み込む方法


※本記事はVOYAGE GROUP VR室ブログの中からVRに関連する技術記事を寄稿いただいております。


こんにちは。買ったBluetoothイヤホンがわずか2週間で壊れた、VGの破壊王ことjujunjun110です。


今回はA-Frameについてのニッチ情報について更新します!


目次



A-Frameにおける3Dモデル読み込み


Mozilaが中心となって開発するWeb-VRフレームワーク、A-Frame。


f:id:jujunjun110:20161019195246p:plain


DOMベースで、ちょちょっと記述するだけで簡単にブラウザでVRコンテンツが作成できる、なかなかすごいやつです。




さて、3Dアプリケーションを作る際の一番の基本といえば3Dモデル。


Box や Sphere などのPrimitive 図形を利用することも多いですが、モデリングした3Dオブジェクトを読み込んで使うこともできます。


HTMLに3Dモデルを読み込む日がとうとう来たかとなかなか胸が熱くなりますね。


ちなみに対応している拡張子は .obj と .dae なのですが、UVメッシュ付きobjの読み込みでハマったので、その際注意すべき点について書いていきます。


Blenderからの書き出し


今回モデリングに使うのはフリーで高機能な3Dモデリングソフト、Blender。


このきりんピヨという生き物をA-Frame上にインポートしてみます。


f:id:jujunjun110:20161019185225g:plain


blenderで普通にモデリングし、4つのマテリアル(うち一つにUVメッシュのテクスチャが設定されている)で構成されています。*1


まず、File >Export >Wavefront (.obj) でデフォルト設定のまま書き出すと…



  • .obj (モデルの形状を表現するデータ)

  • .mtl (モデルのマテリアルを表現するメタデータ)


の2ファイルが出力されます。


A-Frame への読み込み


obj-modelを読みながら、objファイルを読み込みます。

<span class="synComment">&lt;!DOCTYPE html&gt;</span>
<span class="synIdentifier">&lt;</span><span class="synStatement">html</span><span class="synType">lang</span><span class="synIdentifier">=</span><span class="synConstant">"ja"</span><span class="synIdentifier">&gt;</span>
<span class="synIdentifier">&lt;</span><span class="synStatement">head</span><span class="synIdentifier">&gt;</span>
<span class="synIdentifier">&lt;</span><span class="synStatement">meta</span><span class="synType">charset</span><span class="synIdentifier">=</span><span class="synConstant">"utf-8"</span><span class="synIdentifier">&gt;</span>
<span class="synIdentifier">&lt;</span><span class="synStatement">title</span><span class="synIdentifier">&gt;</span>obj sample<span class="synIdentifier">&lt;/</span><span class="synStatement">title</span><span class="synIdentifier">&gt;</span>
<span class="synIdentifier">&lt;</span><span class="synStatement">script</span><span class="synType">src</span><span class="synIdentifier">=</span><span class="synConstant">"js/aframe.min.js"</span><span class="synIdentifier">&gt;&lt;/</span><span class="synStatement">script</span><span class="synIdentifier">&gt;</span>
<span class="synIdentifier">&lt;/</span><span class="synStatement">head</span><span class="synIdentifier">&gt;</span>
<span class="synIdentifier">&lt;</span><span class="synStatement">body</span><span class="synIdentifier">&gt;</span>
<span class="synIdentifier">&lt;</span><span class="synStatement">a</span>-scene<span class="synIdentifier">&gt;</span>

<span class="synIdentifier">&lt;</span><span class="synStatement">a</span>-assets<span class="synIdentifier">&gt;</span>
<span class="synIdentifier">&lt;</span><span class="synStatement">a</span>-asset-item <span class="synType">id</span><span class="synIdentifier">=</span><span class="synConstant">"kirin-obj"</span><span class="synType">src</span><span class="synIdentifier">=</span><span class="synConstant">"model/kirin.obj"</span><span class="synIdentifier">&gt;&lt;/</span><span class="synStatement">a</span>-asset-item<span class="synIdentifier">&gt;</span>
<span class="synIdentifier">&lt;</span><span class="synStatement">a</span>-asset-item <span class="synType">id</span><span class="synIdentifier">=</span><span class="synConstant">"kirin-mtl"</span><span class="synType">src</span><span class="synIdentifier">=</span><span class="synConstant">"model/kirin.mtl"</span><span class="synIdentifier">&gt;&lt;/</span><span class="synStatement">a</span>-asset-item<span class="synIdentifier">&gt;</span>
<span class="synIdentifier">&lt;/</span><span class="synStatement">a</span>-assets<span class="synIdentifier">&gt;</span>

<span class="synIdentifier">&lt;</span><span class="synStatement">a</span>-entity <span class="synType">id</span><span class="synIdentifier">=</span><span class="synConstant">"kirin"</span><span class="synIdentifier">obj-model=</span><span class="synConstant">"obj:#kirin-obj;mtl:#kirin-mtl;"</span><span class="synIdentifier">position=</span><span class="synConstant">"-5 0 -20"</span><span class="synIdentifier">scale=</span><span class="synConstant">"2 2 2"</span><span class="synIdentifier">rotation=</span><span class="synConstant">"0 0 0"</span><span class="synIdentifier">&gt;&lt;/</span><span class="synStatement">a</span>-entity<span class="synIdentifier">&gt;</span>

<span class="synIdentifier">&lt;/</span><span class="synStatement">a</span>-scene<span class="synIdentifier">&gt;</span>
<span class="synIdentifier">&lt;/</span><span class="synStatement">body</span><span class="synIdentifier">&gt;</span>
<span class="synIdentifier">&lt;/</span><span class="synStatement">html</span><span class="synIdentifier">&gt;</span>

a-entityに直接ファイルパスを書いても良いのですが、一旦a-assetsのほうで読み込むことで使い回しの良さやパフォーマンスが上がるのがポイントですね。


これをブラウザで開いて実行!


f:id:jujunjun110:20161019192726p:plain


あれ…


キリンがオレンジ一色に…


f:id:jujunjun110:20161019192917p:plain


javascriptコンソールを開くと、UVマップのデータがNot Found であるとエラーが出ています。


これを修正するためには、.mtl データを編集します。


メタデータを直接編集するのは勇気がいりますが、.obj および.mtl は人間にも読める、優しいファイルフォーマットなので、テキストエディタで直接編集していきましょう。


f:id:jujunjun110:20161019194351p:plain


どうやらこれがUVマップ画像のパスのようです。


UVマップモデリングをしていた際のパスが直接入ってしまっているせいでNot Foundになっているのですね。


そこで、こんな感じでパスを相対パスに書き換えるとともに、


f:id:jujunjun110:20161019194356p:plain


ファイルを.obj や .mtl と同じ階層に配置してやると…


f:id:jujunjun110:20161019193626p:plain


無事テクスチャを読み込めました!!!


f:id:jujunjun110:20161019194645g:plain


ちなみにアニメーションに関しては、.objはそもそも対応していないですし、.dae のほうでもまだうまく動かないようです(未確認)




というわけで、日本全国で何人が必要としてるのかっていうレベルのマイナー情報ですが、A-Frameでのobj読み込みについて書いてみました。


次回は来週水曜、@DayBySay が超役立つ情報を更新してくれると思います。


それでは!



*1:ゲーム用なら、本当は1マテリアルで1枚のUVメッシュにまとめたほうが軽くて良いですね



※元記事:Blenderで出力したUVメッシュ付きobjファイルをA-Frameで読み込む方法 –VOYAGE GROUP VR室ブログ


©VOYAGE GROUP, inc. All Rights Reserved


Copyright ©2016 VR Inside All Rights Reserved.

    Loading...
    アクセスランキング
    1. AI動画生成 DomoAI ドモエイアイ Google最新AI Nano Banana Pro Gemini 3 Pro Image に対応し無制限生成が可能に 圧倒的な制作精度向上と効率化でワンストップAI生成

    2. GoogleがGemini 3発表 マルチモーダル強化で検索と開発基盤に同時展開

    3. 竹内順子「サスケが味方。その時期がどれだけ尊いか」激アツ忍者漫画コラボ!新作アニメ『NARUTO-ナルト-×NINKŪ-忍空-』全4話決定PV公開

    4. HitPaw Edimakor 4.6系列アップデート-Klingモーションコントロール&Vidu Q3 Proで AI 動画表現を進化

    5. まだ9月なのにインフル流行入り!? ワクチンは“打って終わり”じゃない、研究で分かったワクチンの効果(抗体応答)を左右する生活習慣とは

    6. 加工NG、ワンタップで即送信! Instagramが放つ新機能『Instants』。スクショ禁止&閲覧後消滅で、令和のSNSは「映え」から「ありのまま」へ完全シフト

    7. AI動画生成 DomoAI ドモエイアイ トーキングアバター機能強化で音声 感情 会話表現がより人間らしくリアルに マルチボイス 動画素材入力 スクリプト自動分割などアップデート

    8. YouTube、AI動画の開示機能を刷新 システム検知で自動ラベル付与

    9. インフルエンザは冬だけじゃない!異例の早期流行「オフピークインフルエンザ」に備える日常の対策とは

    10. HitPaw Edimakor、AIによる【テキストから動画生成】機能を新搭載――構成もAIで自動化

    game_banner