package { import flash.events.Event; import flash.events.MouseEvent; import org.papervision3d.view.BasicView; import org.papervision3d.materials.ColorMaterial; import org.papervision3d.objects.primitives.Plane; import org.papervision3d.events.InteractiveScene3DEvent; import caurina.transitions.Tweener; import caurina.transitions.properties.FilterShortcuts; public class ImgCircle extends BasicView { private var childnum:uint = 12; private var myPlane:Plane; private var myPlaneW:Number = 50; private var myPlaneH:Number = 50; private var myObject:Object; private var myArry:Array; private var myObjectArry:Array; private var material:ColorMaterial; private var r:Number = 140; private var pointZ:Number; private var pointX:Number; private var dObject:Object; // コンストラクタ public function ImgCircle() { // camera , viewport の設定 setting(); // Plane を作製 setPlane(); // addChild するだけではなく、描画する必要がある。 startRendering(); } // camera , viewport の設定 private function setting():void { // マウスイベントを有効にするため viewport.interactive = true; // Plane おのおのではなく、viewport に設定する。 viewport.buttonMode = true; camera.y = 100; // この値で、100%にはなっていない。 /* 2D上で100%スケールでの表示になるカメラ設定 */ camera.z = -1000; camera.focus = 100; camera.zoom = 11; } // Plane を作製 private function setPlane():void { material = new ColorMaterial(0x336699); // マウスイベントを有効にするため material.interactive = true; //ポリゴンの片面だけを塗るかどうか。planeはこれをfalseにしないと裏側が見えない material.oneSide = false; // 各 primitives を配列で管理。その座標データ等を別配列で管理。 myArry = new Array; myObjectArry = new Array; for (var i:int = 0; i < childnum; i++) { /* material:MaterialObject3D = null, マテリアルz width:Number = 0, 幅 height:Number = 0, 高さ segmentsW:Number = 0, 横分割数 segmentsH:Number = 0, 縦分割数 initObject:Object = null ) ユーザ定義プロパティ */ myPlane = new Plane(material, myPlaneW, myPlaneH, 1, 1); myPlane.rotationX = -8; myPlane.x = r * Math.sin((Math.PI / (childnum / 2)) * i); myPlane.z = -r * Math.cos((Math.PI / (childnum / 2)) * i); scene.addChild(myPlane); myObject = new Object; myObject.x = myPlane.x; myObject.z = myPlane.z; myArry.push(myPlane); myObjectArry.push(myObject); // 特殊なマウスイベントのつけ方 myPlane.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK , rotateZ); } } // マウスイベントで呼ばれる関数。Plane を回す。 private function rotateZ(event:InteractiveScene3DEvent):void { for (var i:int = 0; i < childnum; i++) { if (myArry[i + 1] != undefined) { pointZ = myObjectArry[i + 1].z; pointX = myObjectArry[i + 1].x; }else { pointZ = myObjectArry[0].z; pointX = myObjectArry[0].x; } // フィルターを有効にするために必要。alpha も影響を受ける myArry[i].useOwnContainer = true; FilterShortcuts.init(); Tweener.addTween(myArry[i], { alpha:0.9, _Blur_blurX:15, x:pointX, z:pointZ, time:0.5, delay:0 , onComplete:resetContainer } ); } // 配列の最初を抜き取って、最後に入れている。 dObject = myObjectArry.shift(); myObjectArry.push(dObject); } // 回転が終了したら、useOwnContainer を falese に。 private function resetContainer():void { for (var i:int = 0; i < childnum; i++) { // false にするとフィルターが解除される。 myArry[i].useOwnContainer = false; } } } }