/** * Papervision3Dでのインデックスソートのサンプル 番外編 * DisplayObjectをDisplayObject3DとDisplayObject3Dの間に配置する * * 2010.07.20 作成 * 2010.07.21 3Dオブジェクトではない普通のSpriteを3D空間上に配置するtipsを追加。_initStaticObject関数を見てください。 * * @author Shuhei Kamiya<loftimg.jp> * @see http://loftimg.jp/blog/actionscript/papervision3d-index-sort.php * @see http://loftimg.jp/blog/actionscript/papervision3d-index-sort-extra.php */ package { import com.bit101.components.Label; import com.bit101.components.PushButton; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import org.libspark.betweenas3.BetweenAS3; import org.libspark.betweenas3.easing.Quad; import org.libspark.betweenas3.tweens.ITween; import org.papervision3d.cameras.Camera3D; import org.papervision3d.materials.ColorMaterial; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.objects.primitives.Plane; import org.papervision3d.render.BasicRenderEngine; import org.papervision3d.scenes.Scene3D; import org.papervision3d.view.Viewport3D; import org.papervision3d.view.layer.ViewportLayer; import org.papervision3d.view.layer.util.ViewportLayerSortMode; public class PV3DSortModeExample2 extends Sprite { private var _scene:Scene3D; private var _camera:Camera3D; private var _renderer:BasicRenderEngine; private var _viewport1:Viewport3D; private var _viewport2:Viewport3D; public function PV3DSortModeExample2() { super(); stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; _init3d(); _initObject(); _initStaticObject(); _initScreen(); } private function _init3d():void { _scene = new Scene3D(); _camera = new Camera3D(); _renderer = new BasicRenderEngine(); var half:int = int(stage.stageWidth/2); _viewport1 = new Viewport3D(half, stage.stageHeight + (stage.stageHeight%2 ? 1 : 0), false, false, true, true); _viewport2 = new Viewport3D(half, stage.stageHeight + (stage.stageHeight%2 ? 1 : 0), false, false, true, true); _viewport2.containerSprite.sortMode = ViewportLayerSortMode.INDEX_SORT; //右側に表示されるViewportのソートモードをインデックスソートにする _viewport2.x = stage.stageWidth-half; addChild(_viewport1); addChild(_viewport2); } /** * DisplayObject3Dを3D空間上に配置する * Viewport.containerSprite.getChildLayerを実行してViewportLayerを生成する。 * ViewportLayer.layerIndexに任意の値を入れる事によって深度を設定する(数値が大きい方が手前) */ private function _initObject():void { var p1:DisplayObject3D = _scene.addChild(_createPlane(0xFF0000, 200, 200)); var p2:DisplayObject3D = _scene.addChild(_createPlane(0x0000FF, 200, 200)); p2.z = 100; //インデックスソートで利用するインデックスを設定する //数値が大きいほど手前に表示される _viewport2.getChildLayer(p1).layerIndex = 100; _viewport2.getChildLayer(p2).layerIndex = 0; var t:ITween = BetweenAS3.parallel( BetweenAS3.to(p1, {rotationX: 360, rotationY: 360, rotationZ: 360}, 5), BetweenAS3.to(p2, {rotationX: -360, rotationY: -360, rotationZ: -360}, 5) ); t.stopOnComplete = false; t.onUpdate = _render; t.play(); } /** * スタティックなオブジェクトを3D空間上に配置する * Viewport.containerSprite.getChildLayerを実行してViewportLayerを生成する。 * 生成したViewportLayerはSpriteを継承しているのでDisplayObjectをaddChildが可能。 * ボタンやUIパーツなどを3D空間上に配置したい時に便利かも。 * ※カメラが動いても座標は固定されます。 */ private function _initStaticObject():void { //レイヤー用のDisplayObject3Dオブジェクトを用意する var dummyContainer:DisplayObject3D = new DisplayObject3D(); //ViewportにViewportLayerを追加する var vpl:ViewportLayer = _viewport2.containerSprite.getChildLayer(dummyContainer); //青Planeと赤Planeの間に配置する vpl.layerIndex = 50; var btn:PushButton = new PushButton(null, 0, 0, "SAMPLE"); btn.height = 20; btn.x = int(-btn.width/2); btn.y = int(-btn.height/2); //対象のオブジェクトをViewportLayerにaddChildする vpl.addChild(btn); var t:ITween = BetweenAS3.serial( BetweenAS3.tween(_camera, {x: -100}, {x: 100}, 2, Quad.easeInOut), BetweenAS3.to(_camera, {x: 100}, 2, Quad.easeInOut) ); t.stopOnComplete = false; t.play(); } private function _initScreen():void { new Label(this, 5, 2, "Z Sort"); new Label(this, stage.stageWidth/2 + 5, 2, "Index Sort"); graphics.lineStyle(1, 0x999999); graphics.moveTo(stage.stageWidth/2, 0); graphics.lineTo(stage.stageWidth/2, stage.stageHeight); } private function _createPlane(color:uint, width:Number, height:Number):Plane { var material:ColorMaterial = new ColorMaterial(color, 1, false); material.doubleSided = true; var plane:Plane = new Plane(material, width, height, 2, 2); return plane; } private function _render():void { _renderer.renderScene(_scene, _camera, _viewport1); _renderer.renderScene(_scene, _camera, _viewport2); } } } Papervision3D SortMode Example番外編