| INDEX |

OpenGLの勉強してたら、順当にGLSL(Shader)のことになって、GLSLってPixelBenderに似てるなぁとか思ったら、それもそのはずPixelBenderはGLSLをベースに開発されたっていうし、んだらPixelBenderやってみよう(主にShaderJob系)ってしてたら、flash.geomのUtils3Dとか悪くないなぁとか思いつつ、Flashビルトイン?の3D系APIに向き合ってみよう、といった最近。遅いけど。
で、FLARToolkitは大抵PV3Dとかライブラリと連携してると印象してるのだけど、flash.geomパッケージでやってみようとテストしてみました。

とりあえずUtils3D

まずは、drawTrianglesとセットな感じのあるUtils3Dから。ライブラリ使わないのであれば、速度的にもお手軽度的にもUtils3D→drawTrianglesの流れが順当なような気がする(そうでなければAlchemy)。テストコードはWonderflに置いてますです。

このプログラムのinitCamera()のところで、Frustum(あるいはPerspective)とスクリーン行列的なMatrix3Dをつくる。Frustumの左右上下は対称ってことで行列としてはシンプル。この行列は、PerspectiveProjection#toMatrix3Dで得られる行列と同じような形です。
この行列は、11番目の1のところがポイントというか、これによって変換後のwにz値が入る。wはUtils3Dのパース具合を決める値となるし、1/wがuvtのt値になる。
※172行目のUtils3D用のMatrix3D(projmat)の初期化は、FLARの座標系に合わせるためにやってます。

そんなノリでやってみたらだいたい動いてる感じです。適当なんで間違いがありそうだけども。

transform.perspectiveProjection

次にPerspectiveProjectionでやってみる。このクラス使うの初めてです。てか癖がある、、そんなことないですか?想像しているのと挙動にずれがあるのでうにうにいうとりました。で、なんやかんややってみる。

やってみて嵌ったのは、transform.matrix3Dの代入は参照渡し(つまり代入したmatrix弄ればSpriteも状態変わる)のに対して、transform.perspectiveProjectionの代入はコピーだったこと(多分コピー、、)。transform.matrixもコピー。コピーだったり参照だったりややこしい(というかmatrix3Dが例外なのか、)。
でもって、PerspectiveProjectionの指定はfieldOfViewかfocalLength使うのだけど、focalLengthの方で。initCamera()のとこです。縦横比を_p_scaleYにとっといて変換行列にあてること、計算的にPerspectiveProjectionがfocalLength値だけオフセットしてるぽいので、それを相殺しておくのを忘れないようにすると、なんとなくいい感じ。

この方法だと、普通のシンボルやらSpriteやらをAR空間にマップできてお手軽かなぁとか思いますが、どがんですかね。

今後モバイル系(というかAndroid)では、ファットなライブラリではなく標準APIでやってくほうがいい場合もあるかなぁとか思いつつ、標準APIとPixelBenderでいろいろできるかなぁと思ったりします(swf軽いし)。って始めるのが遅いか、、。

| INDEX |