Away3D 4.1 で View3D のキャプチャでハマったのでメモ


画像をクリックすると別タブでデモが開きます。

上の画像のような Away3D 4.1 でプリミティブの球体に透過PNG のテクスチャを巻いたオブジェクトを作って、このオブジェクトの白い部分にマウスポインタをもっていくとイベントを発生させるテストをしていたのですが…

マウス座標のアタリ判定を取るために、View3D を一度 BitmapData へキャプチャして、それでできた BitmapData から getPixel32 でピクセルの色を取得してやろうとして見事にハマりました。

Away 3D が 4.0 だと、ここ(http://away3d.com/forum/viewthread/2505/)に書いてあったやり方で BitmapData にキャプチャできたのですが、4.1 を使用すると 「View3D.renderer.swapBackBuffer がないよ!」と怒られます。
なんでだよと悪態をつきながら 4.1 のソースを開いて確認したら、ホントになくなってましたw

だったら代わりの方法は?と、ソースを眺めていたら queueSnapshot( BitmapData ) というメソッドを発見。
これを使って試してみたところ…
ダメでしたw

もうこうなったら 4.0 でいいやと思いながらもさらにソースを眺めていると、どうやら shareContext という プロパティを true にしてあげないといけないみたいだったのでサクッと true にしようとしたのですが、「そんなもんは定義されていないよ」と怒られ、またソースをのぞくと…

arcane function set shareContext(value:Boolean):void
{
	_shareContext = value;
}

ん?なんじゃこりゃ?

arcane というキーワードで関数が宣言されていました。
情弱の僕には意味がわからないのでググってみたところ、ここ(http://www.be-interactive.org/?itemid=15)によると、どうやらこれはネームスペースに関数を閉じ込めているということらしいです。
なので _view.renderer.arcane::shareContext = true; と書いたところ、無事動くようになりました。

というわけで、最終的には下記のコードで BitmapData にキャプチャできるようになりました。

private function renderStage3DToBitmap():void
{
	/*
	// Away3D 4.0x Used
	_stage3DDuplicateBmd = new BitmapData( stage.stageWidth, stage.stageHeight );
	_view.renderer.swapBackBuffer = false;
	_stage3DDuplicateBmd.lock();
	_view.render();
	_view.stage3DProxy.context3D.drawToBitmapData( _stage3DDuplicateBmd );
	_stage3DDuplicateBmd.unlock();
	_view.renderer.swapBackBuffer = true;
	*/
	
	// Away3D 4.1x Used
	_stage3DDuplicateBmd = new BitmapData( stage.stageWidth, stage.stageHeight );
	_stage3DDuplicateBmd.lock();
	_view.renderer.arcane::shareContext = true;
	_view.renderer.queueSnapshot( _stage3DDuplicateBmd );
	_view.render();
	_stage3DDuplicateBmd.unlock();
}

あー、疲れた…
それにしても今回のこれ、なんかテキトウにやったらできたのですが、実際やりかたってこれで合ってる?