wonderflで見つけた「Papervison3Dを利用したリボン表現」がかっこよかったので、fork して光ってるっぽい感じにしてみた。GlowFilter を適用して光らせている。

Papervision3D 2.0 のオブジェクトにフィルタを適用するには DisplayObject3D.useOwnContainer = true; としておくことが必要らしい。これを知らなくてずっとはまってた。

ソースコードをコピペして少しだけ整形してここに貼っておく。


// forked from clockmaker's [PV3D] Ribon Road
/*=====================================================*//**
* Papervison3Dを利用したリボン表現
*
* Tweenerを使って作成したベジェ曲線に
* Planeを位置と角度を調整して並べています。
* 強引なやり方なので、いい方法があったら教えてください!
* 
* @author Yasu (clockmaker.jp)
*//*======================================================*/
package
{
    import caurina.transitions.properties.CurveModifiers;
    import caurina.transitions.Tweener;
    import flash.display.*;
    import flash.events.*;
    import flash.filters.*;
    import flash.utils.getTimer;
    import org.papervision3d.core.geom.*;
    import org.papervision3d.core.geom.renderables.*;
    import org.papervision3d.core.proto.*;
    import org.papervision3d.materials.shadematerials.*;
    import org.papervision3d.materials.special.*;
    import org.papervision3d.objects.*;
    import org.papervision3d.objects.primitives.*;
    import org.papervision3d.view.*;
    import org.papervision3d.cameras.*;
    import org.papervision3d.lights.*
    import org.papervision3d.materials.*
    import org.papervision3d.materials.utils.*
    import org.papervision3d.core.math.Matrix3D;
    
    [SWF(width = "720", height = "480", frameRate = "60", backgroundColor="0x000000")]
 
    public class Main extends BasicView
    {
        private var lineMaterial    :LineMaterial;
        private var _arrLines       :Array  = [];
        private var _objArray       :Array  = [];
        private var LINES_NUM       :int    = 1;
        private var MAX_RADIUS      :int    = 3000;
        private var POINT_NUM       :uint   = 5;
        private var VERTICES_NUM    :uint   = 200;
        private var CAMERA_POSITION :uint   = 3000;
        private var _filters        :Array  = null;
        
        public function Main()
        {
            super(0, 0, true, false, CameraType.FREE);
            CurveModifiers.init();
            camera.focus = 250
            camera.zoom = 1
            _filters = createGlowFilters3();
            init()
            startRendering()
        }
 
        private function init():void
        {
            // 3d
            for (var i:int = 0; i < LINES_NUM; i++)
            {
                _arrPlanes[i] = [];
            }
            
            // 2d
            for (i = 0; i < LINES_NUM; i++)
            {
                var newPos:Object = getRandomPos()
                var o:Object =
                {
                    x       : newPos.x,
                    prevX   : newPos.x,
                    y       : newPos.y,
                    prevY   : newPos.y,
                    z       : newPos.z,
                    prevZ   : newPos.z,
                    //color  : Math.random() * 0xFFFFFF
                    color   : 0x00FF00
                }
                _objArray.push(o)
                randomTween(getRandomData(o))
            }
        }
 
        private function randomTween(o:Object):void
        {
            Tweener.addTween(o,
            { 
                x            :    o.x1,
                y            :    o.y1, 
                z            :    o.z1, 
                _bezier      :    o.bezier, 
                time         :    o.time,
                transition   :    "linear", 
                onComplete   :    function():void
                {
                    randomTween(getRandomData(o));
                }
            });
        }
        
        private function getRandomData(o:Object):Object
        {
            o.time = (POINT_NUM * 0.5) + (POINT_NUM * .75);
            var newPos:Object = getRandomPos();
            o.x1 = newPos.x;
            o.y1 = newPos.y;
            o.z1 = newPos.z;
            o.bezier = [];
            for (var i:int = 0; i < POINT_NUM; i++)
            {
                var newBezierPos:Object = getRandomPos();
                o.bezier.push(
                {
                    x : newBezierPos.x,
                    y : newBezierPos.y,
                    z : newBezierPos.z
                });
            }
            return o;
        }
 
        private function getRandomPos():Object
        {
            var angleY:Number = Math.random() * 2 * Math.PI;
            var angleXZ:Number = Math.random() * 2 * Math.PI;
            return {
                x : Math.cos(angleY) * Math.sin(angleXZ) * MAX_RADIUS,
                y : Math.sin(angleY) * Math.sin(angleXZ) * MAX_RADIUS,
                z : Math.cos(angleXZ) * MAX_RADIUS
            };
        }
        
        private var _arrPlanes:Array = []
        
        override protected function onRenderTick(e:Event = null):void
        {
            for (var i:int = 0; i < LINES_NUM; i++)
            {
                var d1:DisplayObject3D = new DisplayObject3D()
                d1.x = _objArray[i].x
                d1.y = _objArray[i].y
                d1.z = _objArray[i].z
                var d2:DisplayObject3D = new DisplayObject3D()
                d2.x = _objArray[i].prevX
                d2.y = _objArray[i].prevY
                d2.z = _objArray[i].prevZ
                
                d1.lookAt(d2);
 
                //d1.useOwnContainer = true;
                //d1.filters = _filters;
                //d2.useOwnContainer = true;
                //d2.filters = _filters;
 
                // Planes
                var len:Number = Math.sqrt(
                    (_objArray[i].x - _objArray[i].prevX) * (_objArray[i].x - _objArray[i].prevX)
                    + (_objArray[i].y - _objArray[i].prevY) * (_objArray[i].y - _objArray[i].prevY)
                    + (_objArray[i].z - _objArray[i].prevZ) * (_objArray[i].z - _objArray[i].prevZ)
                )
                
                var mat:MaterialObject3D = new WireframeMaterial(_objArray[i].color)
                mat.doubleSided = true
                var o:DisplayObject3D = scene.addChild(new Plane(mat, 100, 100))
 
                o.copyTransform(d1.transform)
                o.pitch(90)
                o.useOwnContainer = true;
                o.filters = _filters;
 
                _arrPlanes[i].push(o);
                
                if (_arrPlanes[i].length > 10)
                {
                    var tmp:DisplayObject3D = _arrPlanes[i][0]
                    
                    var cameraTarget :DisplayObject3D = new DisplayObject3D();
                    cameraTarget.copyTransform( tmp );
                    cameraTarget.moveBackward(100);
                    cameraTarget.moveUp(100);
 
                    //cameraTarget.useOwnContainer = true;
                    //cameraTarget.filters = _filters;
 
                    camera.copyTransform(cameraTarget)
                    
                    camera.lookAt(_arrPlanes[i][10])
                    cameraTarget = null
                }
                
                if (_arrPlanes[i].length > VERTICES_NUM)
                {
                    scene.removeChild(_arrPlanes[i].shift())
                }
                
                _objArray[i].prevX = _objArray[i].x;
                _objArray[i].prevY = _objArray[i].y;
                _objArray[i].prevZ = _objArray[i].z;
            }
            
            super.onRenderTick(e);
        }
 
        private static function createGlowFilters1():Array {
            var filters:Array = new Array();
            filters.push(new GlowFilter(0xFFFFFF, 0.5, 20, 20, 2, BitmapFilterQuality.HIGH, false, false));
            return filters;
        }
 
        private static function createGlowFilters2():Array {
            var filters:Array = new Array();
            filters.push(new GlowFilter(0xFFFFFF, 0.5, 20, 20, 2, BitmapFilterQuality.HIGH, false, false));
            filters.push(new GlowFilter(0xFFFFFF, 1, 40, 40, 2, BitmapFilterQuality.HIGH, true, false));
            return filters;
        }
 
        private static function createGlowFilters3():Array {
            var filters:Array = new Array();
            filters.push(new GlowFilter(0xFFFFFF, 0.8, 20, 20, 4, BitmapFilterQuality.HIGH, false, false));
            return filters;
        }
    }
}

記念にスクリーンショット。

Green Glow Ribon Road

Green Glow Ribon Road

Green Glow Ribon Road

Green Glow Ribon Road

もうひとつ Papervision3D に GlowFilter を適用するシンプルなサンプル。

ソースコードも貼っておく。


// forked from nilab's GuruGuru Cube for Papervision3D 2.0
package {
 
  import flash.events.*
  import flash.filters.GlowFilter;
  import org.papervision3d.materials.*;
  import org.papervision3d.materials.utils.*;
  import org.papervision3d.objects.primitives.*;
  import org.papervision3d.view.*;
 
  [SWF(backgroundColor="#000000", frameRate=30)]
 
  // for Papervision3D 2.0
  public class HelloWorld3dGlowCube extends BasicView {
 
    private var cube:Cube;
 
    public function HelloWorld3dGlowCube(){
 
      // make material list
      var wfm:WireframeMaterial = new WireframeMaterial(0x00FF00);
      var mlist:MaterialsList = new MaterialsList();
      mlist.addMaterial(wfm, "all");
 
      // make filters
      var filterList:Array = new Array();
      var glowFilter:GlowFilter = new GlowFilter(0xFFFFFF, 1, 16, 16, 2, 1, false, false); 
      filterList.push(glowFilter);
 
      // make cube
      cube = new Cube(mlist, 600, 400, 100, 4, 2, 3);
      cube.useOwnContainer = true; // for filters
      cube.filters = filterList;
 
      // make world
      scene.addChild(cube);
      stage.addEventListener(Event.ENTER_FRAME, enterFrameListener);
    }
 
    private function enterFrameListener(event:Event):void {
      cube.yaw  ((200 - mouseX) / 120);
      cube.pitch((200 - mouseY) / 120);
      startRendering();
    }
  }
}

tags: zlashdot Flash Flash Papervision3D

Posted by NI-Lab. (@nilab)