今回は予告と内容を変えて、緊急特番だ。前回第2回の記事が公開された翌日2014年11月5日付でAway3Dのビルドが改められた。ライブラリの名前も数も、さらにクラスの読込み方も変わった。勝手がわかってしまえばよいものの、初めは途方に暮れてもおかしくない。そこで今回は、第2回コード2「球体にテクスチャを貼って3次元空間で回す」を、新しいビルドで動くように書き直す。でき上がりは、つぎのサンプル1だ。
Away3Dのライブラリが変わった
まず、ライブラリはつぎの5つを使う。前回まで用いていた2014年8月26日付ビルドでは3ライブラリだった(図1上)。新たなライブラリは、名前の頭が「awayjs-」で揃ったのはわかりやすくてよい。JavaScript(JS)ファイルだけでなく、それぞれのmapも与えられているため、同じ場所に入れておこう(図1下)。
- awayjs-core
- awayjs-display
- awayjs-renderergl
- awayjs-stagegl
- awayjs-methodmaterials
なお、ライブラリはGitHubの「AwayJS」からダウンロードする。Away3D TypeScriptサイトの「Source Files」の欄には、本稿執筆時ではこれまでのまま、3つのライブラリと作例(「GitHub: Examples」)のリンクしかない(図2)。
そして、script要素で読込むライブラリを、これまでの3つから、新たな5つのJSファイルに書き替える。ライブラリ名から「next」が除かれたのは、そろそろ正規リリースが近いのかと期待される。何より、こういう大きな変更はそろそろ終わりにしてほしい。
require()関数でクラスを読込む
これまでAway3Dのクラスは「away」から始まる長い名前空間を添えて参照した。新たなライブラリでは、require()関数でクラスの参照を得る。それを変数に与えて用いるというやり方だ。変数名はクラスと同じにするとわかりやすい。
新たなライブラリでは、「away」から始まる名前空間でクラスを参照することができない。けれど、require()関数でクラスと同じ名前の変数に参照を与えたので、名前空間は取り去ってしまえばよい。たとえば、第2回コード2の初期設定の関数(initialize())は、つぎのように書き替える。AssetLibraryクラスは名前空間から参照しない。あらかじめrequire()関数でクラス名の変数(AssetLibrary)に納めてあるので、直にクラス名を書く。
あとは、残りのコードの名前空間の記述を、変数に定めた直のクラス名にひたすら書き直すだけだ。これでとにかくコードは動く。第2回コード2と同じく、ビーチボールのテクスチャを貼った球体が回る(図3)。
LoaderEvent.RESOURCE_COMPLETEイベントで素材が正しく読み込まれる
ひとつよい知らせがある。第2回「物体にテクスチャを貼って回す」の「3次元空間でボールを回す」で、「LoaderEvent.RESOURCE_COMPLETEイベントのリスナー関数(onResourceComplete())が呼び出されてLoaderEvent.assetsプロパティの参照がとれても、その配列は空のときがある」と述べた。このたびのビルドで、問題は解消した。したがって、リスナー関数はつぎのようにすっきりと書き直せる。
第2回コード2を新たなライブラリで動くように書き直したのが、つぎのコード1だ。script要素に読込むライブラリのJSファイルを差替え、require()関数でクラスの参照を得た。Away3Dの処理の組立ては変わっていない。ただ、LoaderEvent.RESOURCE_COMPLETEイベントの問題がなくなったので、リスナー関数は素直に定めた。jsdo.itのコードは、初めにサンプル1として掲げた。
前回予告してあったテクスチャつきの床を加えることと、ドラッグによりカメラの視界を移すインタラクションは、今回のコード1をもとにして次回仕上げる。