2011年4月30日土曜日

Away3D Lite と Flash の native 3d シーンの共存

Flash のネイティブの 3Dシーンと Away3DLite のシーンを共存させる方法を調べてみた。
試行錯誤の結果こんな感じで

Sprite (Flashネイティブ) のレンダリングレイヤーを作成
----------------------------------------------------
//Flash native 3D シーンの作成
native3dlayer = new Sprite();
native3dlayer.transform.perspectiveProjection = new PerspectiveProjection();
native3dlayer.transform.perspectiveProjection.projectionCenter = new Point(0,0);
native3dlayer_base = new Sprite();
native3dlayer_base.addChild(native3dlayer);
addChild(native3dlayer_base);
----------------------------------------------------

Sprite (Flashネイティブ) のレンダリングレイヤーの描画位置を Away3DLite の描画位置と一致させる
----------------------------------------------------
native3dlayer_base.x = view.x;
native3dlayer_base.y = view.y;
----------------------------------------------------

視野角を一致させるためには Away3DLiteの Camera3D.focus と Spriteレンダリングレイヤーの focalLength を一致させる。
----------------------------------------------------
native3dlayer.transform.perspectiveProjection.focalLength = camera.focus;
----------------------------------------------------

描画倍率を一致させるために Away3DLite の Camera3D.zoom の値でSpriteレンダリングレイヤーの描画倍率を一致させる
----------------------------------------------------
native3dlayer_base.scaleX = camera.zoom;
native3dlayer_base.scaleY = camera.zoom;
----------------------------------------------------

カメラの視点をSpriteレンダリングレイヤーにも適用するためにカメラの変換行列を invert して Sprite に適用
----------------------------------------------------
var mat:Matrix3D = camera.transform.matrix3D.clone();
mat.invert();
native3dlayer.transform.matrix3D = mat;
----------------------------------------------------


ソースコード:ソースコード

サンプルコンテンツを別ウィンドウで開く

2011年4月23日土曜日

Away3D Lite の z オーダーの問題

Away3D Lite はどうにも3Dオブジェクトが重なった時の処理に難がある。本来後ろに見えなければならないオブジェクトが前に来たりする。
解決方法の一つはオブジェクトをレンダリングするレイヤーを複数持たせ、明示的に前後関係をコントロールすることみたいだ。
この手法を行うには FastRenderer というレンダリングクラスを使う。
FastRenderer にはわたしが使っているバージョン 1.0.0 の時点ではバグがあるようである。

FastRenderer クラス (away3dlite/core/render) の collectFaces(object:Object3D) メソッドの以下の処理

for each (child in children) {
if(child.layer)
child.layer.graphics.clear();
collectFaces(child);
}

これは、本来こうならなければならないはずだ。

for each (child in children) {
if(child.layer)
child.layer.graphics.clear();
}
for each (child in children) {
collectFaces(child);
}


ライブラリにこの修正を加え、作ってみたテストコンテンツが以下の通り。
ソースコードも添付した:ソースコード

サンプルコンテンツを別ウィンドウで開く

2011年4月11日月曜日

Away3D Lite と jiglibFlash で Android 向けアプリ(未完成)

Android であれば携帯電話でも Flash/AIR が動くということで、携帯向けのアプリを作ってみようと思案。
Away3DLite と jiglibFlash を使って。
陰影処理や、ミラーのような3D効果はCPUストレスが高いようなので、これら3D効果は全て行わないことに。

こんな感じのを発展させていこうと思う。

2011年4月2日土曜日

Lightwave で最初のアニメーション

簡単なアニメーションだけど結構時間がかかった。
結構大変な作業なんだなと実感。