JavaFX 2.0 の3D機能について調べてみたけど

JavaFX 2.0はハードウェアのグラフィックエンジンをつかって 3Dレンダリング処理ができるという話を聞いて、興味がてら JavaFX に手を出してみた。

JavaFXとは、Swingに変わる新たなクライアントリッチアプリケーションを作成するためのフレームワークで…などという話はおいておいて(もっと詳しいサイトはいくらでもあるから)、実際、どうコーディングするか、という観点でまとめてみる。

アプリケーションを構成するクラス構造としては、

Application -> Stage -> Scene -> Node(s)

となっている。
Application はそのアプリケーション自体のオブジェクト、Stage はウィンドウシステムに応じたルートウィンドウを構成する。そして、Sceneから先、Nodeが図形などの構成要素の木構造をなしていて、それらをまとめて Scene Graph というらしい。Node はいわゆる矩形とかそういった図形要素(Shape)のほかに、Groupとよばれる、Nodeをまとめた集合体があって、ShapeをGroupでひとまとめにし、それをさらにGroupでまとめるなどして巨大な木構造が出来上がり、それらを順番に描画していくこととなる。

そして、 これらのShapeには位置や大きさがあるが、木構造の上から描画していく際にこれらをGroupやShapeごとに移動・回転する仕組みとして、 Translation,Rotation(移動・回転)などがある。いわゆる座標変換の処理で、たぶん高校の数学で頭を悩ませた、写像とかいった話である。そして、これらの座標変換系が (x,y,z)の3次元座標系をもっており、これを順次木構造のルートから各図形オブジェクトにいたるまで3次元座標変換していくあたり、たぶんグラフィックエンジンのパワーを借りている、のだと思う。

3次元空間上での位置のレンダリングは上記のところだけれども、3D描画で必要なもうひとつの肝心の機能が、この3次元空間を画面上、すなわち2次元空間にレンダリングすることである。この機能を受け持つのが、カメラ(camera)であり、遠近描画(遠くを小さくする)をするには、PerspectiveCameraを使用する。遠近描画のない、普通の2次元描画のときはこのカメラがPararelCameraとなる。

…が、このCamera、Sceneに紐付けるものだということ。SceneはNodeのルート要素であり、Stageとは1対1で紐づくらしい。Stageは画面(ウィンドウ)ごとに1つしかないから、事実上、ひとつのウィンドウに1つのCameraしか付けられないと思われる。3次元描画か2次元描画にするかはCameraを変えることで実現することから、1つの画面に2次元と3次元の混在ができないんじゃないだろうか。

これの意味するところは、1つの画面上に3次元のフィールドとステータス表示などの2次元オブジェクトを乗せられないということ。がんばれば実現できるかもしれない(調べが足りないだけかもしれない)けれども、そもそもそういう利用には不向きでは、という気がしてきた。デモ画面で3次元オブジェクトがくるくる回るところで満足してしまって、それを実際どう使うかまではあまり練られていないのでは、と。

JavaMEをちょっと触ったときもなんか融通の悪さが気になったのだけれども、JavaFXを触ってみてなんかそれと似た感覚をどことなく思い出させる、そんな感じ。たぶん3Dの部分がまだ未熟なだけで、それ以外はきっと問題ないのでしょうけど(その、それ以外の部分は調べてないので、なんとも)。それでも、2Dに関しては、オブジェクトの座標変換系は昔から頭を悩ませるものだけど、その部分をフレームワークで持たせている、という点は十分進化していると思う。今のところは2Dで何か作りたい、という思いはあまりないけれど。

追記
ひょっとしたら、Z軸を0にすれば三次元空間上でもメニューやステータスなどの表示ができるのかも。今度時間があったら試してみよう。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック