FLARToolKitで、アッチの世界の覗き窓への道 2歩目 (はちゅねミク)

  • このエントリーをはてなブックマークに追加
  • 80

さて、「アッチの世界の覗き窓」を作るために、前回はパノラマ写真を使ったサンプルを公開してみたが、今回はやはりと言う事でメタセコイアのモデルを使ったバージョンを作ってみた。そのdemoがこちら
今回は、三次元CG@七葉から、はちゅねミクのボーン入りバージョン(0211.zip)を借りてきて、ポーズをつけて配置してみた。あと、箱の壁部分はこちらの素材をお借りした。
しかし、やはり重い。動きがカクカクしてる。そして気付いたんだが、この程度の事するだけなら、別にFLARToolKitじゃなくて、ただの色認識で十分なんじゃないだろうか?そんな気がする。

今回のはちゅねミクバージョンだが、やってみると実は前のパノラマバージョンより簡単だった気がする。パノラマバージョンは、カメラが原点にあり、その周囲をパノラマとなる球体が覆っていて、マーカの位置によってカメラの角度を変えて方向を制御していた。が、今回は原点にモデルがあり、カメラはマーカとほぼ同じように動いているだけ。平行移動を回転に変換する手間が無い。Papervision3Dのカメラは、特に指定しなければモデルを追うので、ホント単純だった。
今回の、マーカに対する処理はこんな感じ。

ActionScript

  1. //マーカの中心点の位置を検出し、傾きとする
  2. var square:FLARSquare = this._detector.getSquare();
  3.  
  4. var Mx:int = Math.max(square.sqvertex[0][0], square.sqvertex[1][0], square.sqvertex[2][0], square.sqvertex[3][0]);
  5. var mx:int = Math.min(square.sqvertex[0][0], square.sqvertex[1][0], square.sqvertex[2][0], square.sqvertex[3][0]);
  6. var My:int = Math.max(square.sqvertex[0][1], square.sqvertex[1][1], square.sqvertex[2][1], square.sqvertex[3][1]);
  7. var my:int = Math.min(square.sqvertex[0][1], square.sqvertex[1][1], square.sqvertex[2][1], square.sqvertex[3][1]);
  8. var center:Point = new Point((Mx + mx)/2, (My+my)/2);
  9.  
  10. this._view.camera.x = -(center.x - this._source.getWidth() / 2) * 1;
  11. this._view.camera.y = -(center.y - this._source.getHeight() / 2) * 1;
  12. this._view.camera.zoom = 1 + square.area / 9000;

前回は、後半3行がこうだった。まぁ、rotationX/Yx/yになっただけなので、コード上はほとんど同じか。

ActionScript

  1. this._view.camera.rotationY = (center.x - this._source.getWidth()/2) / 2;
  2. this._view.camera.rotationX = -(center.y - this._source.getHeight()/2) / 2;
  3. this._view.camera.zoom = 1 + square.area / 9000;

そう全てが上手くはいかない。

ただし、これで成功ではなく、画面サイズを大きくして、フルスクリーンとかにすると、箱の表示が切れるという問題点がある。

通常サイズ
最大化したもの。箱のポリゴンが大胆に切れている。

原因だが、Papervision3Dの挙動っぽい。多分レンダリング時に全ポリゴンに対してカメラに映るか映らないかのテストをしてるんだと思うが、その判定で「カメラに映らない」と誤判定されていると思われる。
判定を避けようと、FrustumTestMethod.NO_TESTINGを設定してみたりしたけど効果が無い。場所が悪いのか、そもそもカメラの後ろと判定される部分については、FrustumTestMethod.NO_TESTINGの範疇外なのかわからないが。

で、これが箱の作成部分。modelに全部の表示オブジェクトを入れている。メタセコのモデルも入る。

ActionScript

  1. var model:DisplayObject3D = new DisplayObject3D();
  2. model.frustumTestMethod = FrustumTestMethod.NO_TESTING;
  3.  
  4. var mt:MaterialObject3D = new BitmapMaterial((new TexBitmap() as Bitmap).bitmapData);
  5.  
  6. mt.doubleSided = true;
  7. var list:MaterialsList = new MaterialsList();
  8. list.addMaterial(mt, "all");
  9.  
  10. var cube:Cube = new Cube(list,3200,6400,2400, 1, 1, 4, Cube.ALL, Cube.BACK);
  11. cube.frustumTestMethod = FrustumTestMethod.NO_TESTING;
  12. model.addChild(cube);

でまぁ、一応解決策があって、最後から3行目のコードをこんな風に変えたら直った。

ActionScript

  1. var cube:Cube = new Cube(list,3200,6400,2400, 1, 1, 32, Cube.ALL, Cube.BACK);

要するに箱の分割数を上げてポリゴンを細かくし、無理矢理カメラに映すという方法だ。が、たかが箱のためにポリゴンの処理が重くなるので、あまりやりたくない。

今回のソースも、勿論Spark Projectに置いてある。
メインクラス:FLARAnotherWorldWindow.as

で、どうだろうか?目標に近づけているのか?

スポンサーリンク
スポンサーリンク
  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサーリンク