※現在、「wonderfl build flash online」求人コンテンツ制作に関してのアンケートを実施中です!みなさまのお力添えを頂いて、続々とアンケート結果が集まっていますが、まだまだ募集しております。ご協力のほど、どうぞよろしくお願いいたします!

wonderfl運営事務局
→アンケートページ(※ログインしてからお答えいただけるようになっています。)

 notice: Flash editor updated! Join the development! Thanks to MiniBuilder


FORKED
  1. // forked from KinkumaDesign's 光を描いて3Dで回すエフェクト
  2. /*
  3. * PerfumeのPV 'baby cruising Love'の中に出てくる光のエフェクトを再現してみました。
  4. * 1:13他 何回か出てきます
  5. * Youtube [PV] "Perfume" baby cruising Love 2nd Enc
  6. http://www.youtube.com/watch?v=76yVixuKqGY
  7. * マウスドラッグで光を描きます
  8. * ハートの形とか可愛いかも
  9. http://www.kuma-de.com/blog/1-programming/1-javascript/2009-09-07/1202
  10. */
  11. package {
  12.     import flash.display.Sprite;
  13.     import flash.events.Event;
  14.     
  15.     import flash.display.Bitmap;
  16.     import flash.display.BitmapData;
  17.     import flash.geom.ColorTransform;
  18.     import flash.geom.Rectangle;
  19.     
  20.     [SWF(backgroundColor="0x000000")]
  21.     public class Main extends Sprite{
  22.         private var _red:Sample6;
  23.         private var _blue:Sample6;
  24.         private var _bitmapData:BitmapData;
  25.         public function Main():void {
  26.             _red = new Sample6(-50);
  27.             this.addChild(_red);
  28.             _blue = new Sample6(50);
  29.             this.addChild(_blue);
  30.             
  31.             _bitmapData = new BitmapData(stage.stageWidth,stage.stageHeight,false,0x000000);
  32.             addChild(new Bitmap(_bitmapData))
  33.             addEventListener(Event.ENTER_FRAME, loop);
  34.         }
  35.         
  36.         private function loop(e:Event):void {
  37.             //_red.update(null);
  38.             //_blue.update(null);
  39.             
  40.             _bitmapData.lock();
  41.             _bitmapData.fillRect(new Rectangle(0,0,stage.stageWidth,stage.stageHeight), 0x000000);
  42.             _bitmapData.draw(_red, null,new ColorTransform(1,0,0,1,0,0,0,0));
  43.             _bitmapData.draw(_blue, null,new ColorTransform(0,1,1,1,0,0,0,0), "add");
  44.             _bitmapData.unlock();
  45.         }
  46.     }
  47. }
  48. import flash.display.Bitmap;
  49. import flash.display.BitmapData;
  50. import flash.display.Graphics;
  51. import flash.display.Sprite;
  52. import flash.events.Event;
  53. import flash.events.MouseEvent;
  54. import flash.filters.BitmapFilter;
  55. import flash.filters.BitmapFilterQuality;
  56. import flash.filters.BlurFilter;
  57. import flash.filters.GlowFilter;
  58. import flash.geom.ColorTransform;
  59. import flash.geom.Matrix;
  60. import flash.geom.Matrix3D;
  61. import flash.geom.PerspectiveProjection;
  62. import flash.geom.Point;
  63. import flash.geom.Rectangle;
  64. import flash.geom.Utils3D;
  65. import flash.geom.Vector3D;
  66. import flash.sampler.NewObjectSample;
  67. import flash.text.TextField;
  68. import flash.text.TextFormat;
  69. [SWF(width = "480", height = "480", backgroundColor = 0x000000, frameRate = "30")]
  70. class Sample6 extends Sprite
  71. {
  72.     public var penSp:Sprite;
  73.     public var canvas:Bitmap;
  74.     public var currentBmd:BitmapData;
  75.     public var lastDrawPoint:Point;
  76.     public var drawPoints:Vector.<DrawPoint>;
  77.     public var proj:Matrix3D;
  78.     public var vout:Vector.<Number> = new Vector.<Number>();
  79.     public var uvts:Vector.<Number> = new Vector.<Number>();
  80.     public var projverts:Vector.<Number> = new Vector.<Number>();
  81.     public var moveCount:int = 0;
  82.     
  83.     public var hsw:Number;
  84.     public var hsh:Number;
  85.     
  86.     public var logText:TextField;
  87.     
  88.     private var _dX:Number;
  89.     public function Sample6(dX:Number
  90.     {
  91.         _dX = dX;
  92.         this.addEventListener(Event.ADDED_TO_STAGE, onStage);
  93.         //stage.addEventListener(MouseEvent.MOUSE_DOWN, initHD);
  94.     }
  95.     private function onStage(event:Event):void {
  96.         stage.addEventListener(MouseEvent.MOUSE_DOWN, initHD);
  97.         
  98.     }
  99.     
  100.     private function initHD(e:MouseEvent):void 
  101.     {
  102.         stage.removeEventListener(MouseEvent.MOUSE_DOWN, initHD);
  103.         
  104.         hsw = stage.stageWidth / 2;
  105.         hsh = stage.stageHeight / 2;
  106.         
  107.         var perse:PerspectiveProjection = new PerspectiveProjection();
  108.         perse.focalLength = 350;
  109.         proj = perse.toMatrix3D();
  110.         drawPoints = new Vector.<DrawPoint>();
  111.         initCanvas();
  112.         initLog();
  113.         
  114.         stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHD);
  115.         stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHD);
  116.         stage.addEventListener(Event.ENTER_FRAME, update);
  117.     }
  118.     
  119.     private function initLog():void
  120.     {
  121.         logText = new TextField();
  122.         addChild(logText);
  123.         logText.x = 8;
  124.         logText.y = 6;
  125.         var tf:TextFormat = new TextFormat();
  126.         tf.color = 0xffffff;
  127.         tf.size = 10;
  128.         tf.font = "_gothicMono";
  129.         logText.selectable = false;
  130.         logText.defaultTextFormat = tf;
  131.     }
  132.     
  133.     private function initCanvas():void
  134.     {
  135.         var w:Number = stage.stageWidth;
  136.         var h:Number = stage.stageHeight;
  137.         currentBmd = new BitmapData(w, h, true, 0xff000000);
  138.         canvas = new Bitmap(currentBmd);
  139.         addChild(canvas);
  140.         canvas.x = _dX*0.7;
  141.         
  142.         penSp = new Sprite();
  143.         penSp.filters = [getGlowFilter(), getBlurFilter()];
  144.     }
  145.     
  146.     private function getGlowFilter():GlowFilter {
  147.         var color:Number = 0xFFF2D3;
  148.         var alpha:Number = 0.85;
  149.         var blurX:Number = 16;
  150.         var blurY:Number = 16;
  151.         var strength:Number = 3;
  152.         var inner:Boolean = false;
  153.         var knockout:Boolean = false;
  154.         var quality:Number = BitmapFilterQuality.HIGH;
  155.         
  156.         return new GlowFilter(color,
  157.             alpha,
  158.             blurX,
  159.             blurY,
  160.             strength,
  161.             quality,
  162.             inner,
  163.             knockout);
  164.     }
  165.     
  166.     private function getBlurFilter():BlurFilter {
  167.         var blurX:Number = 2;
  168.         var blurY:Number = 2;
  169.         return new BlurFilter(blurX, blurY, BitmapFilterQuality.HIGH);
  170.     }
  171.     
  172.     
  173.     private function update(e:Event):void 
  174.     {
  175.         updateDrawPoints();
  176.         updateDraw();
  177.         
  178.         var r:Rectangle = currentBmd.rect;
  179.         currentBmd.lock();
  180.         currentBmd.fillRect(r, 0x000000);
  181.         currentBmd.draw(penSp, new Matrix(), new ColorTransform(), null, r);
  182.         currentBmd.unlock();
  183.         logText.text = "POINTS:" + drawPoints.length.toString();
  184.     }
  185.     
  186.     private function updateDraw():void
  187.     {
  188.         var g:Graphics = penSp.graphics;
  189.         g.clear();
  190.         var len:int = drawPoints.length;
  191.         var drawPoint:DrawPoint;
  192.         
  193.         var verts:Vector.<Number> = new Vector.<Number>();
  194.         var i:int;
  195.         for (i = 0; i < len; i++) {
  196.             drawPoint = drawPoints[i];
  197.             verts.push(drawPoint.drawX, drawPoint.drawY);
  198.         }
  199.         if (verts.length > 8) {
  200.             drawThickSprine(g, verts, 3);
  201.         }
  202.     }
  203.     
  204.     //参考 FrocessingではじめるActionScriptドローイング 第4回 スケッチしてみよう
  205.     //http://gihyo.jp/design/feature/01/frocessing/0004?page=4
  206.     private function drawThickSprine(g:Graphics, verts:Vector.<Number>, thick:Number):void
  207.     {
  208.         var verts0:Vector.<Number> = new Vector.<Number>();
  209.         var verts1:Vector.<Number> = new Vector.<Number>();
  210.         
  211.         var i:int;
  212.         var len:int = verts.length;
  213.         var vx:Number, vy:Number;
  214.         var pt:Point;
  215.         var px0:Number = verts[0];
  216.         var py0:Number = verts[1];
  217.         var px1:Number, py1:Number;
  218.         var drawPoint:DrawPoint;
  219.         for (i = 2; i + 1 < len; i += 2) {
  220.             px1 = verts[i];
  221.             py1 = verts[i + 1];
  222.             vx = px1 - px0;
  223.             vy = py1 - py0;
  224.             pt = new Point(vx, vy);
  225.             pt.normalize(1);
  226.             verts0.push(Math.floor(px0 + pt.y * thick));
  227.             verts0.push(Math.floor(py0 - pt.x * thick));
  228.             verts1.push(Math.floor(px0 - pt.y * thick));
  229.             verts1.push(Math.floor(py0 + pt.x * thick));
  230.             px0 = px1;
  231.             py0 = py1;
  232.         }
  233.         
  234.         var dVerts0:Vector.<Number> = new Vector.<Number>();
  235.         var dVerts1:Vector.<Number> = new Vector.<Number>();
  236.         
  237.         //初期値
  238.         dVerts0.push(00, verts0[0], verts0[1], verts0[2], verts0[3], verts0[4], verts0[5]);
  239.         dVerts1.push(verts1[4], verts1[5], verts1[2], verts1[3], verts1[0], verts1[1], 00);
  240.         
  241.         //描画
  242.         len -= 2;
  243.         for (i = 6; i + 1 < len; i += 2) {
  244.             dVerts0.shift();
  245.             dVerts0.shift();
  246.             dVerts0.push(verts0[i], verts0[i + 1]);
  247.             dVerts1.unshift(verts1[i], verts1[i + 1]);
  248.             dVerts1.pop();
  249.             dVerts1.pop();
  250.             drawPoint = drawPoints[Math.floor(i / 2)];
  251.             g.beginFill(0xFFFEF1, drawPoint.timeFactor);
  252.             g.moveTo(dVerts0[2], dVerts0[3]);
  253.             splineTo(g, dVerts0, 3);
  254.             g.lineTo(dVerts1[2], dVerts1[3]);
  255.             splineTo(g, dVerts1, 3);
  256.             g.lineTo(dVerts0[2], dVerts0[3]);
  257.             g.endFill();
  258.         }
  259.     }
  260.     
  261.     //参考 Catmull-Rom スプライン曲線
  262.     //http://l00oo.oo00l.com/blog/archives/264
  263.     
  264.     //verts: (x0, y0, x1, y1, x2, y2, x3, y3)
  265.     private function splineTo(g:Graphics, verts:Vector.<Number>, numSegments:int):void
  266.     {
  267.         var i:int;
  268.         var len:int = verts.length;
  269.         var t:Number;
  270.         for (i = 0; i < numSegments; i++) {
  271.             t = (i + 1) / numSegments;
  272.             g.lineTo(
  273.                 catmullRom(verts[0], verts[2], verts[4], verts[6], t),
  274.                 catmullRom(verts[1], verts[3], verts[5], verts[7], t)
  275.             );
  276.         }
  277.     }
  278.     
  279.     private function catmullRom(p0:Number, p1:Number, p2:Number, p3:Number, t:Number):Number
  280.     {
  281.         var v0:Number = (p2 - p0) * 0.5;
  282.         var v1:Number = (p3 - p1) * 0.5;
  283.         return (2 * p1 - 2 * p2 + v0 + v1) * t * t * t + ( -3 * p1 + 3 * p2 - 2 * v0 - v1) * t * t + v0 * t + p1;
  284.     }
  285.     
  286.     //時間がきたら消去
  287.     public function updateDrawPoints():void
  288.     {
  289.         if (drawPoints.length < 1) {
  290.             return;
  291.         }
  292.         var drawPoint:DrawPoint = drawPoints[0];
  293.         
  294.         while (drawPoint.nextPoint != null){
  295.             drawPoint.aliveTime--;
  296.             if (drawPoint.aliveTime < 1) {
  297.                 drawPoints.shift();
  298.             }
  299.             updateDrawPoint(drawPoint);
  300.             drawPoint = drawPoint.nextPoint;
  301.         }
  302.         updateDrawPoint(drawPoint);
  303.         drawPoint.aliveTime--;
  304.         if (drawPoint.aliveTime < 1) {
  305.             drawPoints.shift();
  306.         }
  307.     }
  308.     
  309.     //時間に応じてY軸回転
  310.     private function updateDrawPoint(drawPoint:DrawPoint):void
  311.     {
  312.         var mat:Matrix3D = new Matrix3D();
  313.         mat.appendRotation((1 - drawPoint.timeFactor) * 540, Vector3D.Y_AXIS);
  314.         mat.appendTranslation(-_dX, 0500);
  315.         mat.transformVectors(Vector.<Number>([drawPoint.x, drawPoint.y, drawPoint.z]), vout);
  316.         Utils3D.projectVectors(proj, vout, projverts, uvts);
  317.         drawPoint.drawX = projverts[0] + hsw;
  318.         drawPoint.drawY = projverts[1] + hsh;
  319.     }
  320.     
  321.     private function mouseUpHD(e:MouseEvent):void 
  322.     {
  323.         stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHD);
  324.     }
  325.     
  326.     private function mouseDownHD(e:MouseEvent):void 
  327.     {
  328.         stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHD);
  329.     }
  330.     
  331.     private function mouseMoveHD(e:MouseEvent = null):void 
  332.     {
  333.         //制御点をあまりとりすぎないように間引く
  334.         moveCount++;
  335.         if (moveCount % 3 != 0) {
  336.             return;
  337.         }
  338.         moveCount = 0;
  339.         
  340.         //領域を超えたら描画しない
  341.         if (stage.mouseX > stage.stageWidth || stage.mouseY > stage.stageHeight) {
  342.             return;
  343.         }
  344.         
  345.         var drawPoint:DrawPoint = new DrawPoint(stage.mouseX -hsw, stage.mouseY -hsh);
  346.         if (drawPoints.length > 0) {
  347.             drawPoints[drawPoints.length - 1].nextPoint = drawPoint;
  348.         }
  349.         drawPoints.push(drawPoint);
  350.     }
  351. }
  352. import flash.display.Sprite;
  353. class DrawPoint 
  354. {
  355.     public var x:Number;
  356.     public var y:Number;
  357.     public var z:Number;
  358.     public var aliveTime:int = 300;
  359.     public var nextPoint:DrawPoint;
  360.     public var drawX:Number;
  361.     public var drawY:Number;
  362.     public function get timeFactor():Number 
  363.     {
  364.         return aliveTime / 300;
  365.     }
  366.     
  367.     public function DrawPoint(x:Number, y:Number) {
  368.         this.x = x;
  369.         this.y = y;
  370.         this.z = 0;
  371.     }
  372. }
noswf
  1. // forked from KinkumaDesign's 光を描いて3Dで回すエフェクト
  2. /*
  3.  * PerfumeのPV 'baby cruising Love'の中に出てくる光のエフェクトを再現してみました。
  4.  * 1:13他 何回か出てきます
  5.  * 
  6.  * Youtube [PV] "Perfume" baby cruising Love 2nd Enc
  7.  * http://www.youtube.com/watch?v=76yVixuKqGY
  8.  * 
  9.  * マウスドラッグで光を描きます
  10.  * ハートの形とか可愛いかも
  11.  * 
  12.  * http://www.kuma-de.com/blog/1-programming/1-javascript/2009-09-07/1202
  13.  */
  14. package  
  15. {
  16.     import flash.display.Bitmap;
  17.     import flash.display.BitmapData;
  18.     import flash.display.Graphics;
  19.     import flash.display.Sprite;
  20.     import flash.events.Event;
  21.     import flash.events.MouseEvent;
  22.     import flash.filters.BitmapFilter;
  23.     import flash.filters.BitmapFilterQuality;
  24.     import flash.filters.BlurFilter;
  25.     import flash.filters.GlowFilter;
  26.     import flash.geom.ColorTransform;
  27.     import flash.geom.Matrix;
  28.     import flash.geom.Matrix3D;
  29.     import flash.geom.PerspectiveProjection;
  30.     import flash.geom.Point;
  31.     import flash.geom.Rectangle;
  32.     import flash.geom.Utils3D;
  33.     import flash.geom.Vector3D;
  34.     import flash.sampler.NewObjectSample;
  35.     import flash.text.TextField;
  36.     import flash.text.TextFormat;
  37.     
  38.         [SWF(width = "480", height = "480", backgroundColor = 0x000000, frameRate = "30")]
  39.     public class Main extends Sprite
  40.     {
  41.         public var penSp:Sprite;
  42.         public var canvas:Bitmap;
  43.         public var currentBmd:BitmapData;
  44.         public var lastDrawPoint:Point;
  45.         public var drawPoints:Vector.<DrawPoint>;
  46.         public var proj:Matrix3D;
  47.         public var vout:Vector.<Number> = new Vector.<Number>();
  48.         public var uvts:Vector.<Number> = new Vector.<Number>();
  49.         public var projverts:Vector.<Number> = new Vector.<Number>();
  50.         public var moveCount:int = 0;
  51.         
  52.         public var hsw:Number;
  53.         public var hsh:Number;
  54.         
  55.         public var logText:TextField;
  56.         
  57.         
  58.         public function Main() 
  59.         {
  60.             stage.addEventListener(MouseEvent.MOUSE_DOWN, initHD);
  61.         }
  62.         
  63.         private function initHD(e:MouseEvent):void 
  64.         {
  65.             stage.removeEventListener(MouseEvent.MOUSE_DOWN, initHD);
  66.             hsw = stage.stageWidth / 2;
  67.             hsh = stage.stageHeight / 2;
  68.             
  69.             var perse:PerspectiveProjection = new PerspectiveProjection();
  70.             perse.focalLength = 350;
  71.             proj = perse.toMatrix3D();
  72.             drawPoints = new Vector.<DrawPoint>();
  73.             initCanvas();
  74.             initLog();
  75.             
  76.             stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHD);
  77.             stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHD);
  78.             stage.addEventListener(Event.ENTER_FRAME, update);
  79.         }
  80.         
  81.         private function initLog():void
  82.         {
  83.             logText = new TextField();
  84.             addChild(logText);
  85.             logText.x = 8;
  86.             logText.y = 6;
  87.             var tf:TextFormat = new TextFormat();
  88.             tf.color = 0xffffff;
  89.             tf.size = 10;
  90.             tf.font = "_gothicMono";
  91.             logText.selectable = false;
  92.             logText.defaultTextFormat = tf;
  93.         }
  94.         
  95.         private function initCanvas():void
  96.         {
  97.             var w:Number = stage.stageWidth;
  98.             var h:Number = stage.stageHeight;
  99.             currentBmd = new BitmapData(w, h, true, 0xff000000);
  100.             canvas = new Bitmap(currentBmd);
  101.             addChild(canvas);
  102.             
  103.             penSp = new Sprite();
  104.             penSp.filters = [getGlowFilter(), getBlurFilter()];
  105.         }
  106.         
  107.         private function getGlowFilter():GlowFilter {
  108.             var color:Number = 0xFFF2D3;
  109.             var alpha:Number = 0.85;
  110.             var blurX:Number = 16;
  111.             var blurY:Number = 16;
  112.             var strength:Number = 3;
  113.             var inner:Boolean = false;
  114.             var knockout:Boolean = false;
  115.             var quality:Number = BitmapFilterQuality.HIGH;
  116.             return new GlowFilter(color,
  117.                                   alpha,
  118.                                   blurX,
  119.                                   blurY,
  120.                                   strength,
  121.                                   quality,
  122.                                   inner,
  123.                                   knockout);
  124.         }
  125.         
  126.         private function getBlurFilter():BlurFilter {
  127.             var blurX:Number = 2;
  128.             var blurY:Number = 2;
  129.             return new BlurFilter(blurX, blurY, BitmapFilterQuality.HIGH);
  130.         }
  131.         
  132.         private function update(e:Event):void 
  133.         {
  134.             updateDrawPoints();
  135.             updateDraw();
  136.             
  137.             var r:Rectangle = currentBmd.rect;
  138.             currentBmd.lock();
  139.             currentBmd.fillRect(r, 0x000000);
  140.             currentBmd.draw(penSp, new Matrix(), new ColorTransform(), null, r);
  141.             currentBmd.unlock();
  142.             logText.text = "POINTS:" + drawPoints.length.toString();
  143.         }
  144.         
  145.         public function updateDraw():void
  146.         {
  147.             var g:Graphics = penSp.graphics;
  148.             g.clear();
  149.             var len:int = drawPoints.length;
  150.             var drawPoint:DrawPoint;
  151.             
  152.             var verts:Vector.<Number> = new Vector.<Number>();
  153.             var i:int;
  154.             for (i = 0; i < len; i++) {
  155.                 drawPoint = drawPoints[i];
  156.                 verts.push(drawPoint.drawX, drawPoint.drawY);
  157.             }
  158.             if (verts.length > 8) {
  159.                 drawThickSprine(g, verts, 3);
  160.             }
  161.         }
  162.         
  163.         //参考 FrocessingではじめるActionScriptドローイング 第4回 スケッチしてみよう
  164.         //http://gihyo.jp/design/feature/01/frocessing/0004?page=4
  165.         private function drawThickSprine(g:Graphics, verts:Vector.<Number>, thick:Number):void
  166.         {
  167.             var verts0:Vector.<Number> = new Vector.<Number>();
  168.             var verts1:Vector.<Number> = new Vector.<Number>();
  169.             
  170.             var i:int;
  171.             var len:int = verts.length;
  172.             var vx:Number, vy:Number;
  173.             var pt:Point;
  174.             var px0:Number = verts[0];
  175.             var py0:Number = verts[1];
  176.             var px1:Number, py1:Number;
  177.             var drawPoint:DrawPoint;
  178.             for (i = 2; i + 1 < len; i += 2) {
  179.                 px1 = verts[i];
  180.                 py1 = verts[i + 1];
  181.                 vx = px1 - px0;
  182.                 vy = py1 - py0;
  183.                 pt = new Point(vx, vy);
  184.                 pt.normalize(1);
  185.                 verts0.push(Math.floor(px0 + pt.y * thick));
  186.                 verts0.push(Math.floor(py0 - pt.x * thick));
  187.                 verts1.push(Math.floor(px0 - pt.y * thick));
  188.                 verts1.push(Math.floor(py0 + pt.x * thick));
  189.                 px0 = px1;
  190.                 py0 = py1;
  191.             }
  192.             
  193.             var dVerts0:Vector.<Number> = new Vector.<Number>();
  194.             var dVerts1:Vector.<Number> = new Vector.<Number>();
  195.             
  196.             //初期値
  197.             dVerts0.push(00, verts0[0], verts0[1], verts0[2], verts0[3], verts0[4], verts0[5]);
  198.             dVerts1.push(verts1[4], verts1[5], verts1[2], verts1[3], verts1[0], verts1[1], 00);
  199.             
  200.             //描画
  201.             len -= 2;
  202.             for (i = 6; i + 1 < len; i += 2) {
  203.                 dVerts0.shift();
  204.                 dVerts0.shift();
  205.                 dVerts0.push(verts0[i], verts0[i + 1]);
  206.                 dVerts1.unshift(verts1[i], verts1[i + 1]);
  207.                 dVerts1.pop();
  208.                 dVerts1.pop();
  209.                 drawPoint = drawPoints[Math.floor(i / 2)];
  210.                 g.beginFill(0xFFFEF1, drawPoint.timeFactor);
  211.                 g.moveTo(dVerts0[2], dVerts0[3]);
  212.                 splineTo(g, dVerts0, 3);
  213.                 g.lineTo(dVerts1[2], dVerts1[3]);
  214.                 splineTo(g, dVerts1, 3);
  215.                 g.lineTo(dVerts0[2], dVerts0[3]);
  216.                 g.endFill();
  217.             }
  218.         }
  219.     
  220.         //参考 Catmull-Rom スプライン曲線
  221.         //http://l00oo.oo00l.com/blog/archives/264
  222.         
  223.         //verts: (x0, y0, x1, y1, x2, y2, x3, y3)
  224.         private function splineTo(g:Graphics, verts:Vector.<Number>, numSegments:int):void
  225.         {
  226.             var i:int;
  227.             var len:int = verts.length;
  228.             var t:Number;
  229.             for (i = 0; i < numSegments; i++) {
  230.                 t = (i + 1) / numSegments;
  231.                 g.lineTo(
  232.                     catmullRom(verts[0], verts[2], verts[4], verts[6], t),
  233.                     catmullRom(verts[1], verts[3], verts[5], verts[7], t)
  234.                 );
  235.             }
  236.         }
  237.     
  238.         private function catmullRom(p0:Number, p1:Number, p2:Number, p3:Number, t:Number):Number
  239.         {
  240.             var v0:Number = (p2 - p0) * 0.5;
  241.             var v1:Number = (p3 - p1) * 0.5;
  242.             return (2 * p1 - 2 * p2 + v0 + v1) * t * t * t + ( -3 * p1 + 3 * p2 - 2 * v0 - v1) * t * t + v0 * t + p1;
  243.         }
  244.         
  245.         //時間がきたら消去
  246.         public function updateDrawPoints():void
  247.         {
  248.             if (drawPoints.length < 1) {
  249.                 return;
  250.             }
  251.             var drawPoint:DrawPoint = drawPoints[0];
  252.             
  253.             while (drawPoint.nextPoint != null){
  254.                 drawPoint.aliveTime--;
  255.                 if (drawPoint.aliveTime < 1) {
  256.                     drawPoints.shift();
  257.                 }
  258.                 updateDrawPoint(drawPoint);
  259.                 drawPoint = drawPoint.nextPoint;
  260.             }
  261.             updateDrawPoint(drawPoint);
  262.             drawPoint.aliveTime--;
  263.             if (drawPoint.aliveTime < 1) {
  264.                 drawPoints.shift();
  265.             }
  266.         }
  267.         
  268.         //時間に応じてY軸回転
  269.         private function updateDrawPoint(drawPoint:DrawPoint):void
  270.         {
  271.             var mat:Matrix3D = new Matrix3D();
  272.             mat.appendRotation((1 - drawPoint.timeFactor) * 540, Vector3D.Y_AXIS);
  273.             mat.appendTranslation(00500);
  274.             mat.transformVectors(Vector.<Number>([drawPoint.x, drawPoint.y, drawPoint.z]), vout);
  275.             Utils3D.projectVectors(proj, vout, projverts, uvts);
  276.             drawPoint.drawX = projverts[0] + hsw;
  277.             drawPoint.drawY = projverts[1] + hsh;
  278.         }
  279.         
  280.         private function mouseUpHD(e:MouseEvent):void 
  281.         {
  282.             stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHD);
  283.         }
  284.         
  285.         private function mouseDownHD(e:MouseEvent):void 
  286.         {
  287.             stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHD);
  288.         }
  289.         
  290.         private function mouseMoveHD(e:MouseEvent = null):void 
  291.         {
  292.             //制御点をあまりとりすぎないように間引く
  293.             moveCount++;
  294.             if (moveCount % 3 != 0) {
  295.                 return;
  296.             }
  297.             moveCount = 0;
  298.             
  299.             //領域を超えたら描画しない
  300.             if (stage.mouseX > stage.stageWidth || stage.mouseY > stage.stageHeight) {
  301.                 return;
  302.             }
  303.             
  304.             var drawPoint:DrawPoint = new DrawPoint(stage.mouseX -hsw, stage.mouseY -hsh);
  305.             if (drawPoints.length > 0) {
  306.                 drawPoints[drawPoints.length - 1].nextPoint = drawPoint;
  307.             }
  308.             drawPoints.push(drawPoint);
  309.         }
  310.     }
  311. }
  312. import flash.display.Sprite;
  313. class DrawPoint 
  314. {
  315.     public var x:Number;
  316.     public var y:Number;
  317.     public var z:Number;
  318.     public var aliveTime:int = 300;
  319.     public var nextPoint:DrawPoint;
  320.     public var drawX:Number;
  321.     public var drawY:Number;
  322.     public function get timeFactor():Number 
  323.     {
  324.         return aliveTime / 300;
  325.     }
  326.     
  327.     public function DrawPoint(x:Number, y:Number) {
  328.         this.x = 2x;
  329.         this.y = y;
  330.         this.z = 0;
  331.     }
  332. }
noswf
  1. // forked from KinkumaDesign's 光を描いて3Dで回すエフェクト
  2. /*
  3.  * PerfumeのPV 'baby cruising Love'の中に出てくる光のエフェクトを再現してみました。
  4.  * 1:13他 何回か出てきます
  5.  * 
  6.  * Youtube [PV] "Perfume" baby cruising Love 2nd Enc
  7.  * http://www.youtube.com/watch?v=76yVixuKqGY
  8.  * 
  9.  * マウスドラッグで光を描きます
  10.  * ハートの形とか可愛いかも
  11.  * 
  12.  * http://www.kuma-de.com/blog/1-programming/1-javascript/2009-09-07/1202
  13.  */
  14. package  
  15. {
  16.     import flash.display.Bitmap;
  17.     import flash.display.BitmapData;
  18.     import flash.display.Graphics;
  19.     import flash.display.Sprite;
  20.     import flash.events.Event;
  21.     import flash.events.MouseEvent;
  22.     import flash.filters.BitmapFilter;
  23.     import flash.filters.BitmapFilterQuality;
  24.     import flash.filters.BlurFilter;
  25.     import flash.filters.GlowFilter;
  26.     import flash.geom.ColorTransform;
  27.     import flash.geom.Matrix;
  28.     import flash.geom.Matrix3D;
  29.     import flash.geom.PerspectiveProjection;
  30.     import flash.geom.Point;
  31.     import flash.geom.Rectangle;
  32.     import flash.geom.Utils3D;
  33.     import flash.geom.Vector3D;
  34.     import flash.sampler.NewObjectSample;
  35.     import flash.text.TextField;
  36.     import flash.text.TextFormat;
  37.     
  38.         [SWF(width = "480", height = "480", backgroundColor = 0x000000, frameRate = "30")]
  39.     public class Main extends Sprite
  40.     {
  41.         public var penSp:Sprite;
  42.         public var canvas:Bitmap;
  43.         public var currentBmd:BitmapData;
  44.         public var lastDrawPoint:Point;
  45.         public var drawPoints:Vector.<DrawPoint>;
  46.         public var proj:Matrix3D;
  47.         public var vout:Vector.<Number> = new Vector.<Number>();
  48.         public var uvts:Vector.<Number> = new Vector.<Number>();
  49.         public var projverts:Vector.<Number> = new Vector.<Number>();
  50.         public var moveCount:int = 0;
  51.         
  52.         public var hsw:Number;
  53.         public var hsh:Number;
  54.         
  55.         public var logText:TextField;
  56.         
  57.         
  58.         public function Main() 
  59.         {
  60.             stage.addEventListener(MouseEvent.MOUSE_DOWN, initHD);
  61.         }
  62.         
  63.         private function initHD(e:MouseEvent):void 
  64.         {
  65.             stage.removeEventListener(MouseEvent.MOUSE_DOWN, initHD);
  66.             hsw = stage.stageWidth / 2;
  67.             hsh = stage.stageHeight / 2;
  68.             
  69.             var perse:PerspectiveProjection = new PerspectiveProjection();
  70.             perse.focalLength = 350;
  71.             proj = perse.toMatrix3D();
  72.             drawPoints = new Vector.<DrawPoint>();
  73.             initCanvas();
  74.             initLog();
  75.             
  76.             stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHD);
  77.             stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHD);
  78.             stage.addEventListener(Event.ENTER_FRAME, update);
  79.         }
  80.         
  81.         private function initLog():void
  82.         {
  83.             logText = new TextField();
  84.             addChild(logText);
  85.             logText.x = 8;
  86.             logText.y = 6;
  87.             var tf:TextFormat = new TextFormat();
  88.             tf.color = 0xffffff;
  89.             tf.size = 10;
  90.             tf.font = "_gothicMono";
  91.             logText.selectable = false;
  92.             logText.defaultTextFormat = tf;
  93.         }
  94.         
  95.         private function initCanvas():void
  96.         {
  97.             var w:Number = stage.stageWidth;
  98.             var h:Number = stage.stageHeight;
  99.             currentBmd = new BitmapData(w, h, true, 0xff000000);
  100.             canvas = new Bitmap(currentBmd);
  101.             addChild(canvas);
  102.             
  103.             penSp = new Sprite();
  104.             penSp.filters = [getGlowFilter(), getBlurFilter()];
  105.         }
  106.         
  107.         private function getGlowFilter():GlowFilter {
  108.             var color:Number = 0xFFF2D3;
  109.             var alpha:Number = 0.85;
  110.             var blurX:Number = 16;
  111.             var blurY:Number = 16;
  112.             var strength:Number = 3;
  113.             var inner:Boolean = false;
  114.             var knockout:Boolean = false;
  115.             var quality:Number = BitmapFilterQuality.HIGH;
  116.             return new GlowFilter(color,
  117.                                   alpha,
  118.                                   blurX,
  119.                                   blurY,
  120.                                   strength,
  121.                                   quality,
  122.                                   inner,
  123.                                   knockout);
  124.         }
  125.         
  126.         private function getBlurFilter():BlurFilter {
  127.             var blurX:Number = 2;
  128.             var blurY:Number = 2;
  129.             return new BlurFilter(blurX, blurY, BitmapFilterQuality.HIGH);
  130.         }
  131.         
  132.         private function update(e:Event):void 
  133.         {
  134.             updateDrawPoints();
  135.             updateDraw();
  136.             
  137.             var r:Rectangle = currentBmd.rect;
  138.             currentBmd.lock();
  139.             currentBmd.fillRect(r, 0x000000);
  140.             currentBmd.draw(penSp, new Matrix(), new ColorTransform(), null, r);
  141.             currentBmd.unlock();
  142.             logText.text = "POINTS:" + drawPoints.length.toString();
  143.         }
  144.         
  145.         public function updateDraw():void
  146.         {
  147.             var g:Graphics = penSp.graphics;
  148.             g.clear();
  149.             var len:int = drawPoints.length;
  150.             var drawPoint:DrawPoint;
  151.             
  152.             var verts:Vector.<Number> = new Vector.<Number>();
  153.             var i:int;
  154.             for (i = 0; i < len; i++) {
  155.                 drawPoint = drawPoints[i];
  156.                 verts.push(drawPoint.drawX, drawPoint.drawY);
  157.             }
  158.             if (verts.length > 8) {
  159.                 drawThickSprine(g, verts, 3);
  160.             }
  161.         }
  162.         
  163.         //参考 FrocessingではじめるActionScriptドローイング 第4回 スケッチしてみよう
  164.         //http://gihyo.jp/design/feature/01/frocessing/0004?page=4
  165.         private function drawThickSprine(g:Graphics, verts:Vector.<Number>, thick:Number):void
  166.         {
  167.             var verts0:Vector.<Number> = new Vector.<Number>();
  168.             var verts1:Vector.<Number> = new Vector.<Number>();
  169.             
  170.             var i:int;
  171.             var len:int = verts.length;
  172.             var vx:Number, vy:Number;
  173.             var pt:Point;
  174.             var px0:Number = verts[0];
  175.             var py0:Number = verts[1];
  176.             var px1:Number, py1:Number;
  177.             var drawPoint:DrawPoint;
  178.             for (i = 2; i + 1 < len; i += 2) {
  179.                 px1 = verts[i];
  180.                 py1 = verts[i + 1];
  181.                 vx = px1 - px0;
  182.                 vy = py1 - py0;
  183.                 pt = new Point(vx, vy);
  184.                 pt.normalize(1);
  185.                 verts0.push(Math.floor(px0 + pt.y * thick));
  186.                 verts0.push(Math.floor(py0 - pt.x * thick));
  187.                 verts1.push(Math.floor(px0 - pt.y * thick));
  188.                 verts1.push(Math.floor(py0 + pt.x * thick));
  189.                 px0 = px1;
  190.                 py0 = py1;
  191.             }
  192.             
  193.             var dVerts0:Vector.<Number> = new Vector.<Number>();
  194.             var dVerts1:Vector.<Number> = new Vector.<Number>();
  195.             
  196.             //初期値
  197.             dVerts0.push(00, verts0[0], verts0[1], verts0[2], verts0[3], verts0[4], verts0[5]);
  198.             dVerts1.push(verts1[4], verts1[5], verts1[2], verts1[3], verts1[0], verts1[1], 00);
  199.             
  200.             //描画
  201.             len -= 2;
  202.             for (i = 6; i + 1 < len; i += 2) {
  203.                 dVerts0.shift();
  204.                 dVerts0.shift();
  205.                 dVerts0.push(verts0[i], verts0[i + 1]);
  206.                 dVerts1.unshift(verts1[i], verts1[i + 1]);
  207.                 dVerts1.pop();
  208.                 dVerts1.pop();
  209.                 drawPoint = drawPoints[Math.floor(i / 2)];
  210.                 g.beginFill(0xFFFEF1, drawPoint.timeFactor);
  211.                 g.moveTo(dVerts0[2], dVerts0[3]);
  212.                 splineTo(g, dVerts0, 3);
  213.                 g.lineTo(dVerts1[2], dVerts1[3]);
  214.                 splineTo(g, dVerts1, 3);
  215.                 g.lineTo(dVerts0[2], dVerts0[3]);
  216.                 g.endFill();
  217.             }
  218.         }
  219.     
  220.         //参考 Catmull-Rom スプライン曲線
  221.         //http://l00oo.oo00l.com/blog/archives/264
  222.         
  223.         //verts: (x0, y0, x1, y1, x2, y2, x3, y3)
  224.         private function splineTo(g:Graphics, verts:Vector.<Number>, numSegments:int):void
  225.         {
  226.             var i:int;
  227.             var len:int = verts.length;
  228.             var t:Number;
  229.             for (i = 0; i < numSegments; i++) {
  230.                 t = (i + 1) / numSegments;
  231.                 g.lineTo(
  232.                     catmullRom(verts[0], verts[2], verts[4], verts[6], t),
  233.                     catmullRom(verts[1], verts[3], verts[5], verts[7], t)
  234.                 );
  235.             }
  236.         }
  237.     
  238.         private function catmullRom(p0:Number, p1:Number, p2:Number, p3:Number, t:Number):Number
  239.         {
  240.             var v0:Number = (p2 - p0) * 0.5;
  241.             var v1:Number = (p3 - p1) * 0.5;
  242.             return (2 * p1 - 2 * p2 + v0 + v1) * t * t * t + ( -3 * p1 + 3 * p2 - 2 * v0 - v1) * t * t + v0 * t + p1;
  243.         }
  244.         
  245.         //時間がきたら消去
  246.         public function updateDrawPoints():void
  247.         {
  248.             if (drawPoints.length < 1) {
  249.                 return;
  250.             }
  251.             var drawPoint:DrawPoint = drawPoints[0];
  252.             
  253.             while (drawPoint.nextPoint != null){
  254.                 drawPoint.aliveTime--;
  255.                 if (drawPoint.aliveTime < 1) {
  256.                     drawPoints.shift();
  257.                 }
  258.                 updateDrawPoint(drawPoint);
  259.                 drawPoint = drawPoint.nextPoint;
  260.             }
  261.             updateDrawPoint(drawPoint);
  262.             drawPoint.aliveTime--;
  263.             if (drawPoint.aliveTime < 1) {
  264.                 drawPoints.shift();
  265.             }
  266.         }
  267.         
  268.         //時間に応じてY軸回転
  269.         private function updateDrawPoint(drawPoint:DrawPoint):void
  270.         {
  271.             var mat:Matrix3D = new Matrix3D();
  272.             mat.appendRotation((1 - drawPoint.timeFactor) * 540, Vector3D.Y_AXIS);
  273.             mat.appendTranslation(00500);
  274.             mat.transformVectors(Vector.<Number>([drawPoint.x, drawPoint.y, drawPoint.z]), vout);
  275.             Utils3D.projectVectors(proj, vout, projverts, uvts);
  276.             drawPoint.drawX = projverts[0] + hsw;
  277.             drawPoint.drawY = projverts[1] + hsh;
  278.         }
  279.         
  280.         private function mouseUpHD(e:MouseEvent):void 
  281.         {
  282.             stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHD);
  283.         }
  284.         
  285.         private function mouseDownHD(e:MouseEvent):void 
  286.         {
  287.             stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHD);
  288.         }
  289.         
  290.         private function mouseMoveHD(e:MouseEvent = null):void 
  291.         {
  292.             //制御点をあまりとりすぎないように間引く
  293.             moveCount++;
  294.             if (moveCount % 3 != 0) {
  295.                 return;
  296.             }
  297.             moveCount = 0;
  298.             
  299.             //領域を超えたら描画しない
  300.             if (stage.mouseX > stage.stageWidth || stage.mouseY > stage.stageHeight) {
  301.                 return;
  302.             }
  303.             
  304.             var drawPoint:DrawPoint = new DrawPoint(stage.mouseX -hsw, stage.mouseY -hsh);
  305.             if (drawPoints.length > 0) {
  306.                 drawPoints[drawPoints.length - 1].nextPoint = drawPoint;
  307.             }
  308.             drawPoints.push(drawPoint);
  309.         }
  310.     }
  311. }
  312. import flash.display.Sprite;
  313. class DrawPoint 
  314. {
  315.     public var x:Number;
  316.     public var y:Number;
  317.     public var z:Number;
  318.     public var aliveTime:int = 300;
  319.     public var nextPoint:DrawPoint;
  320.     public var drawX:Number;
  321.     public var drawY:Number;
  322.     public function get timeFactor():Number 
  323.     {
  324.         return aliveTime / 300;
  325.     }
  326.     
  327.     public function DrawPoint(x:Number, y:Number) {
  328.         this.x = x;
  329.         this.y = y;
  330.         this.z = 0;
  331.     }
  332. }
noswf
Get Adobe Flash Player