note.x

[Away3D] View3D

オレ向けメモの続き。表示系の土台たるView3Dを押さえてみる。
クラス名の雰囲気的にPV3DのViewport3Dと同じものかと思っちゃうけど、どちらかというとBasicViewクラスに近い。

View3Dを生成すると、主なものとして

  • Scene3D
  • カメラ
  • レンダラ
  • AbstractRenderSession
  • クリッピング領域
  • foreground、overlay、interactiveLayer、backgroundという4つのSprite

が定義される。
このうちforeground、overlay、interactiveLayer、backgroundについては下記のようになってる。

View3dのコンテナ構造

3D空間のレンダリング結果が描画される_session.container(AbstractRenderSession.container)を挟む形で、画面手前からforeground、overlay、interactiveLayer、_session.container、backgroundの順。foregroundは、3D空間より手前に表示したいもの(ゲームだと体力ゲージとか、エースコンバットみたいなものならHUDを)をここにaddChildしとけってことか。

逆にbackgroundは、3D空間よりも奥にあって、遠景の画像とかを配置するみたいな使い方かな。interactiveLayerは、MovieMaterialに割り当てたMovieClipがインタラクティブ要素を含む場合に使われてるみたいなんだけどイマイチわかんね。パッと見た感じ_session.containerには外部からアクセスできないみたいなので、PV3DのマルチViewportみたいなことは、とりあえずムリかもしれない。

overlayは、overlayEffectという分類のエフェクト専用コンテナで今のところLensFlareエフェクトがある。overlayにエフェクトを追加する場合は、専用メソッドのaddOverlayを使う。

View3D自体もSpriteを継承していて、3D空間ごとStageに配置するようなイメージ。View3Dの原点は(矩形領域と考えて)左上ではなく(矩形領域の)中心になるのでView3Dのx、y座標を定義する場合に注意。例えばステージのセンターにView3Dを配置する場合は

var view:View3D = new View3D();
view.x:stage.stageWidth/2;
view.y:stage.stageHeight/2;

もしくは

var view:View3D = new View3D({x:stage.stageWidth/2, y:stage.stageHeight/2});

てな感じに。
foregroundやbackgroundも、つい左上が原点と考えがちだけど、これらも中心が原点になる。

コンストラクタへの引数はオブジェクトで渡す。表記は冗長になるけどコードを見た時にパラメータの意味が把握しやすい。

View3D({scene:hoge, camera:fuga, stats:false, x:500, y:300});

引数は下記のような感じ。

stats:Boolean[true]… ステータスパネルのon/off
scene:Scene3D[new Scene3D()]… Scene3D設定
camera:Camera3D[new Camera3D({x:0, y:0, z:-1000, lookat:"center"}]… カメラ設定
renderer:IRenderer[new BasicRenderer()]… レンダラ設定
session:AbstractSession[new SpriteSession()]… Session設定
clip:Clipping[new RectangleClipping()]… クリッピングする矩形領域の設定
x:Number[0]… View3D自体のx座標
y:Number[0]… View3D自体のy座標
forceUpdate:Boolean[false]… 毎フレーム強制レンダリングの有効・無効
mouseZeroMove:Boolean[false]… mousemoveイベント強制発生の有効・無効
mouseEvents:Boolean[true]… マウスイベントの有効・無効

※[]内はデフォルト値

stats

swf再生時に3Dオブジェクトを[ctrl] + クリック(Windows環境なら右クリック)で表示されるコンテキストメニューからステータスパネルを呼び出す機能を有効化するかどうか。

var view:View3D = new View3D({stats:false});

で、ステータスパネルを無効化。

scene

通常デフォルトのままでいいと思うけど、Scene3Dのコンストラクタでphysicsと、tickTraverserが設定できるので、ここを指定したい場合なんかに

var scene3d:Scene3D = new Scene3D({physics});
var view:View3D = new View3D({scene:scene3d});

とかいう感じで設定するんだろうけど、肝心のphysicsと、tickTraverserについてが全くわかんね。とりあえず保留。

camera

Camera3D以外のカメラ使う場合は必ず指定。

var targetCamera:TargetCamera3D = new TargetCamera3D();
var view:View3D = new View3D({camera:targetCamera});

renderer

デフォルトのBasicRenderer以外に、QuadrantRendererってのがあって、空間分割最適化されたレンダラか?とか思ったけどよくわからん。追記ねぎミクで遊んだ時に調べた事を完全に忘れて何をすっとぼけてるのかオレは…。レンダラについては別途まとめる。

あと、以前デモで使ったFogFilterのようなフィルタ類を適応したい場合も任意に指定する必要がある。

var fog:FogFilter = new FogFilter({material:new ColorMaterial(0xFFFFFF,{alpha:0.1}),minZ:5000,maxZ:20000});
var rend:BasicRenderer = new BasicRenderer(fog);
var view:View3D = new View3D({renderer:rend});

session

PV3DのRenderSessionと同じようなもの(むしろPV3Dが取り入れた)と考えてたんだけど、Away3DはSessionで描画処理を一局集中で行ってるみたい(PV3Dだと描画系の処理は各マテリアルで行う)なので全然違うシロモノかもしれない。よーわからんッス。

clip

通常はデフォルト値で問題無いと思うけど、より狭い範囲で頂点クリップしたい場合は任意に指定する。

var rc:RectangleClipping = new RectangleClipping(-500,-500,500,500);
var view:View3D = new View3D({clip:rc});

※デフォルトは、RectangleClipping(-1000000,-1000000,1000000,1000000)

forceUpdate

デフォルトはfalse。trueを指定すると、シーン内のオブジェクトやカメラの位置などに変化がなく、レンダリングし直す必要が無い場合でも強制的に毎フレームレンダリングする。

mouseZeroMove

デフォルトはfalse。trueを指定すると、対象オブジェクトにマウスカーソルが重なっている限り、カーソルを動かさなくても強制的にMouseEvent3D.MOUSE_MOVEイベントを発生し続けるようになる。(mouseEvents有効時)

mouseEvents

デフォルトはtrue。マウスイベントの有効・無効を指定する。PV3DのViewport3D.interactiveみたいなもんか。


Trackback URL : http://blog.r3c7.net/as3-software-rendering/182/trackback/

Leave a Reply