(同人作家のための)A-Frame入門
OculusGo買ってからVRが楽しくて。
でもクリエイター?気質人間としては、自分で作ったものをこのVRで動かしてみたくて、いろいろやってました。
その際の記録を兼ねて、記事を残しておきます。
この記事は
という層を想定して書いています。別に同人作家に限らないんだけどね!大体同人作家かなって。。
A-Frameとはなんぞ
A-Frameとは、aframe.ioで開発されているWebでVRを実現するためのフレームワークです。
aframe.io
右下をみるとSupported by Mozillaとあるように、Mozilla Fundationに支援をうけて進められているプロジェクトのようです。
Aframeの特徴は
- パソコン、スマホ、専用ゴーグル(OculusやVive)多種多様な機種で表示できる。(気軽に楽しめる。他人に見せやすい。)
- 公開するのに審査は不要
- テキストエディタで開発できる。その際パソコンで気軽にプレビューできる。
- パフォーマンスが良い(比較的複雑なモデルも軽快に動く)
辺りだと思います。専用ストアを通さないためマネタイズ等は難しいとか、複雑なゲームを作るには向かないと思うのですが、とにかく気軽にVR作品を作ってみたい人向きのソフトです。
何はともあれ最初の一歩
御託は良い。まず試してみてほしい。テキストエディタを用意して、以下のようにHTMLを作成して保存、Webブラウザで開いてみてください。ブラウザは割と何でもいいですが、FirefoxやChromeが良いようです。(Edgeでも動く)
<!doctype html> <html> <head> <script src="https://aframe.io/releases/0.8.0/aframe.min.js"></script> </head> <body> <a-scene> <a-box position="-1 0.5 -3" rotation="0 45 0" color="#4CC3D9"></a-box> <a-sphere position="0 1.25 -5" radius="1.25" color="#EF2D5E"></a-sphere> <a-cylinder position="1 0.75 -3" radius="0.5" height="1.5" color="#FFC65D"></a-cylinder> <a-plane position="0 0 -4" rotation="-90 0 0" width="4" height="4" color="#7BC8A4"></a-plane> <a-sky color="#ECECEC"></a-sky> </a-scene> </body> </html>
ようこそVRワールドへ!
四角と球と円柱とが表示されたかと思います。
パソコンのブラウザならドラッグ、スマホなら画面の向きを変えてみる、専用ゴーグルとか、スマホ+ハコスコが用意できる人は右下のゴーグル…私には”にわかせんぺい”のマークに見えるのですがそこはどうでもいい、アイマスクボタンを押してみてください。
これだけ、これだけなんです。
画像を表示してみる。
PNGファイルが良いようです。ただ、0.8.0はローカルではうまくいかないっぽくて。。
追記2:タグが間違ってました。。画像を指定するタグは<a-asset-item>ではなく<img>です。(修正済)
Webサーバーにアップロードしてから試した方が良いかもしれません。
追記:コンソール見たら、ローカルは正しく動かないからサーバー上でやって(ローカルサーバーとか使ってください)って警告が出てますね。サーバー無くても動作はするんですけどサーバーを使う方が無難だと思います。
<!doctype html> <html> <head> <script src="https://aframe.io/releases/0.8.0/aframe.min.js"></script> </head> <body> <a-scene> <a-assets> <img id="sample" src="sample.png"></img> </a-assets> <a-image src="#sample" width="3" height="2" position="0 1 -2"></a-image> <a-sky color="#888888"></a-sky> </a-scene> </body> </html>
モデルを表示してみる
A-Frameは標準で、
- GLTFファイル
- COLLADAファイル
- OBJ/MTLファイル
を読み込むことができます。公式にはGLTFファイルを推奨しているのですが、
現状下の二つが候補になると思います。
サンプルにOBJ/MTLファイルを用意してみました。(スケールを間違えたので巨大な椅子。。)
http://angel.s234.xrea.com/pureplus/vr/chair.obj
http://angel.s234.xrea.com/pureplus/vr/chair.mtl
<!doctype html> <html> <head> <script src="https://aframe.io/releases/0.8.0/aframe.min.js"></script> </head> <body> <a-scene> <a-assets> <a-asset-item id="chair-obj" src="chair.obj"></a-asset-item> <a-asset-item id="chair-mtl" src="chair.mtl"></a-asset-item> </a-assets> <a-entity obj-model="obj: #chair-obj; mtl:#chair-mtl"></a-entity> <a-sky color="#888888"></a-sky> </a-scene> </body> </html>
細かい解説等は次回としたいと思います。
待てない方は、英語になりますが公式サイトのドキュメントが一番良いです。
日本語の情報もいくつかあるんだけど、古い情報が多いので、その場合はバージョンも合わせてみた方が良いかもしれません。
実機
お久しぶりです。
や、前回L4Re動かそうとしてARM版がちゃんと動かなくて頓挫しててな。。
あれからもいろいろ研究してて、MINIXも面白そう(そして取っ付きやすそう)だなと。
というわけで
・実機の手配(Beaglebone)
・MINIX(http://www.minix3.org/)
という組み合わせで遊んでみようと思っています。
その合間にL4の研究できたらなって。あきらめてないよ!
動かす計画
まず訂正。
2/4のblogで私、
って書いたんですけど、L4Linuxのサイトみてたら、
For a native configuration it is generally safe to use nearly anything like drivers but do not enable features like ACPI, apic/ioapic, HPET, highmem, MTRR, MCE, power management and similar.
って書いてました。
えっと雑に要約すると、「ACPIとかhighmemのごく一部の設定以外は、ネイティブのドライバは動くよ」と。
動くんじゃん!
L4Linux見るとL4Server群へアクセスするドライバが追加されてるんですが、
- L4LinuxはL4Serverと連携できる
- L4Linuxはそれ単独のドライバも動く
ということみたいですね。なんだ素晴らしい。
もちろんLinuxのネイティブドライバが動いてしまったら堅牢性は落ちてしまうのですが、とりあえず動かすだけなら大丈夫っぽいです。
まずは、、まずは開発環境を整えるところからですよ。
私のスキルや環境を鑑みて、「RasberryPi上でL4Linuxを動かす」ことを目標に進めたいと考えてます。buildrootつかって、以下のように進めようかなと。
qemu-arm用のbuildroot構築はこちらを参考にしたら簡単っぽいです。
https://www.hiroom2.com/2015/05/21/qemu-system-armでvexpress-a9を動かす/
buildrootなのでクロスコンパイラ環境まで自動的に構築してくれるのですが、L4用にC++コンパイラが必要で、デフォルトでは無効になっているので、これを有効化しないといけないです。具体的な方法はまた来週。。のんびりですまんー
行き詰り
L4Re について調べてて、ぼんやりとその姿が見えてきているのですが、改めてまとめてここに書くとなると難しいですね。。でも定期的にココに何か書くことは続けたいので徒然と書いてみます。
・起動時の権限はInitTaskのNadが何か握ってそう。
・起動時にLuaスクリプトを使って各プロセスを立ち上げてるんですが、たぶんNadが関わってるんじゃないかな。。。。
・Luaスクリプト内でCapabilityを設定している。Capabilityが機能名兼権限かなあ。
・メモリアロケーターはやはりRootTaskのMoeなので、Taskの起動時も何か関わってるはず。
・デバイスドライバはIo。
いまは動かしながら見ようかなと思ってビルド環境を作っています。
先週までmacOS上でビルドしようとしてたんだけど、HomeblewはXcodeのコンパイラを使う関係で、L4Reがコンパイラに未対応みたいで。。ちょっとやり方考えてます。やっぱLinuxが要るかもなー
改めて、他人にわかるように情報をまとめるのって難しいですね。。
でもそのレベルまで整理しないと後で見ると自分でも分からなくなるから、頑張りたい。
L4Linux
L4Linuxというのがある。
L4上で動くLinuxなんですけどね。
素のLinuxとの違いは、LinuxKernelが特権モードで動くかどうかです。
L4Linuxの中を確認して見たんですが、L4のタスクの一つとしてLinuxが動くだけで、デバイスドライバもL4Serverへの通信(ほとんどIOserverだと思います)に置き換えられてました。
これ書いてて気付いたんですが、これUserModeLinuxをL4に移植しただけですね。
でもこの構成ってLinuxの豊富なデバイスドライバーが活かされないんですよねー。。
できればLinuxのデバイスドライバーから直接デバイスを使いたいなー。
あと、Moe(RootServer)、IO(IOServer)あたりはシステムに対して特別な機能を持っているわけで、それと1ユーザーアプリであるLinuxとはカーネルはどう違うのか、調べて見たいなーと思ってます。
■
3週目にして!3日坊主とはよく言ったものですねー。(他人事
そろそろ図を用意したいんですけど、どんなソフトで書こうか考えてました。。
L4の特徴は、マイクロカーネルであるということです。
カーネル…ここでは、MMUでメモリを管理するモダンなコンピューターシステムにおいて、特権モードで動作するモジュールです。
このようなシステムでは、カーネルだけが特権モードで、それ以外のモジュールは全てユーザーモードで動作します。カーネルだけがコンピューターの全てを操作可能で、それ以外のモジュールは全て制限付きのモードで動作するわけです。
たとえばLinuxであっても、カーネルだけが特権モードで動作します。
そしてLinuxの場合、カーネルが非常に多機能なので、カーネルとわずかなアプリケーションのみで最低限のシステムが構築できたりします。
しかし、特権モードで動くカーネルは、低機能な方が都合が良い場合もあります。
とにかく低機能で、しかし高性能であることを目指したのがL4です。
実際のL4は、もっと機能が絞り込まれていて、例えばメモリアロケーターやスケジューラー、割り込みなどは一部分のみがカーネルで動作し、残りの部分はユーザー部分で動作するRootTaskやServer群に移されています。メモリアロケーターですらカーネルで完結しないのがL4なのです。
先ほどLinuxはカーネルとわずかなアプリのみでシステムが構築できると書きました。
逆に言うと、L4はカーネルが低機能すぎて、実のところ多くのアプリと組み合わせなければシステムが成立しません。
上記の通り、メモリアロケーターすらカーネルで完結しておらず、ぶっちゃけカーネルは一人では何もできないのです。
そこで、教材/リファレンスとして、システムを構築する際に一般的に必要そうなアプリをL4用に集めた物がL4Reです。
本命はカーネルなのですが、せっかくL4Reという教材があるのですから、これを調査してみたいと思います。
というのは、カーネルはそのIFから聞きなれない構造だし、機能として完結していないので、慣れないと見通しが悪いのです。。何度か挫折済みなの。
RootTaskとかを通して、完結した機能として理解した方が私としては理解しやすいなぁ、、と。
それらを理解して、「カーネルはこう使う」という流れで進めたいと思います。
来週はRootTaskの概要かな。