In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

forked from: PV3Dの鍛錬 forked from: レインボーロード! forked from: nengafl

@OKASUKE
* Nengaflフォークさせてもらいます。PV3D鍛錬
* 2010/01/23 動かして、巻きもどしてみるよ
* 時間があればもっといろいろいじりたい。

PV3Dで簡単に綺麗な図形を作ってみよう!

PV3Dを使うと3Dを超簡単に扱えます。
そこで、PV3Dで簡単に綺麗な図形を作ってみましょう。
簡単な数式とパラメータだけで綺麗な図形が完成!
下で定義してある定数のp, q, a, l, m をいじってみてください。

また、for文の中の数式を書き換えるとさらに形が変わります。
単純に、sin → cos みたいに書き換えてみてもおもしろいかも!
/**
 * Copyright hiro_loveness ( http://wonderfl.net/user/hiro_loveness )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/91p1
 */

// forked from OKASUKE's PV3Dの鍛錬 forked from: レインボーロード! forked from: nengafl
/*@OKASUKE
* Nengaflフォークさせてもらいます。PV3D鍛錬
* 2010/01/23 動かして、巻きもどしてみるよ
* 時間があればもっといろいろいじりたい。
*/

// forked from nengafl's nengafl
/*
   PV3Dで簡単に綺麗な図形を作ってみよう!

   PV3Dを使うと3Dを超簡単に扱えます。
   そこで、PV3Dで簡単に綺麗な図形を作ってみましょう。
   簡単な数式とパラメータだけで綺麗な図形が完成!
   下で定義してある定数のp, q, a, l, m をいじってみてください。
   
   また、for文の中の数式を書き換えるとさらに形が変わります。
   単純に、sin → cos みたいに書き換えてみてもおもしろいかも!
*/
package
{
    
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.BlendMode;
    import flash.events.Event;
    import flash.geom.Matrix;
    import frocessing.color.FColor;
    import org.papervision3d.core.geom.Pixels;
    import org.papervision3d.core.geom.renderables.Pixel3D;
    import org.papervision3d.view.BasicView;
    import org.papervision3d.view.layer.BitmapEffectLayer;

    [SWF(width="465", height="465", backgroundColor="0x000000", frameRate="30")]
    public class Nengafl extends BasicView
    {
        // 計算に使うパラメータ
        // このあたりを適当に変えてみるだけでも面白いです!
        //----------------------------------------------------------------
        private const p:int=3;
        private const q:int=12;
        private const a:int=100;
        private const l:Number=0.9;
        private const m:Number=1.1;
        //----------------------------------------------------------------

        private var pixels:Pixels;
        private var canvas:BitmapData;
        private var mtx:Matrix;

        private static const Col:int = 180;
                
        // コンストラクタ
        public function Nengafl()
        {
            super(0, 0, true, true);

            // レイヤー作成。PV3Dでエフェクト使うときはこれを最初に作ります
            var layer:BitmapEffectLayer=new BitmapEffectLayer(viewport, 465, 465, true, 0, "clear_pre", true);
            layer.clearBeforeRender=true;
            viewport.containerSprite.addLayer(layer);

            camera.z=-500;

            // Pixelsの初期化
            pixels=new Pixels(layer);
            scene.addChild(pixels);

            /*var c:int=0;
            var cc:FColor=new FColor;

            // パラメータと数式でPixelの位置を計算する
            for (var i:Number=0; i <= 6 * Math.PI; i+=0.02)
            {
                // 数式に従ってx, y, z を計算。ここを適当に変えてみても面白いです。
                // 簡単にsin → cos に変えてみるとか!
                //trace(Math.cos(q / p * i)) // * Math.cos(i) * a);
                //trace(Math.sin(i));
                var xx:Number=(2 + Math.cos(q / p * i)) * Math.cos(i) * a;
                var yy:Number=Math.sin(q / p * i) * a * 1.6;
                var zz:Number=(2 + Math.cos(q / p * i)) * Math.sin(i) * a;

                // 綺麗なグラデーションになるように色を設定
                // こういうときはHSVを使うのが便利です
                cc.hsv(Col, 1, 1);
                var color:uint=cc.value32;
                trace(color);
                for (var j:int=0; j < 15; j++)
                {
                    // x, y, z を l~mの範囲で散らします。
                    // l~mの区間の乱数を出す計算:(m - l) * Math.random() + l
                    var px:Pixel3D=new Pixel3D(color, xx * ((m - l) * Math.random() + l), yy * ((m - l) * Math.random() + l), zz * ((m - l) * Math.random() + l));
                    pixels.addPixel3D(px);
                }
                c++;
                //trace(c);
            }*/

            // キラキラロジック
            canvas=new BitmapData(465 / 4, 465 / 4, false, 0x000000);
            var bmp:Bitmap=new Bitmap(canvas, "never", true);
            bmp.scaleX=bmp.scaleY=4;
            bmp.smoothing=true;
            bmp.blendMode = BlendMode.ADD;
            addChild(bmp);
            mtx=new Matrix(0.25, 0, 0, 0.25);
        
            // PV3Dの描写開始!
            startRendering();

            // フレームイベント追加
            addEventListener(Event.ENTER_FRAME, onFrame);
        }
        private var _N:Number = 0;
        private var _iPixel:Number = 0;
        private var _jPixel:Number = 0; 
        private var px:Pixel3D;
        private var c:int = 0;
        // フレームイベント用関数
        private function onFrame(e:Event):void
        {
            
            if (_N <= 6) {
                DrawP();
                _N += 0.1;    
            } else {                
                RemoveP();
                if (_jPixel <= 0) {
                    _N = 0;
                    _iPixel = 0;
                    _jPixel = 0;
                }
                //trace(_jPixel);
            }
            
            // キラキラを描写
            canvas.fillRect(canvas.rect, 0x000000);
            canvas.draw(viewport, mtx);

            // Y軸でローテーション
            pixels.rotationY+=0.2;
        }
        
        private function DrawP():void {
            
            var cc:FColor=new FColor;

            // パラメータと数式でPixelの位置を計算する
            for (_iPixel; _iPixel <= _N * Math.PI; _iPixel+=0.02)
            {
                // 数式に従ってx, y, z を計算。ここを適当に変えてみても面白いです。
                // 簡単にsin → cos に変えてみるとか!
                //trace(Math.cos(q / p * i)) // * Math.cos(i) * a);
                //trace(Math.sin(i));
                var xx:Number=(2 + Math.cos(q / p * _iPixel)) * Math.cos(_iPixel) * a;
                var yy:Number=Math.sin(q / p * _iPixel) * a * 1.6;
                var zz:Number=(2 + Math.cos(q / p * _iPixel)) * Math.sin(_iPixel) * a;

                // 綺麗なグラデーションになるように色を設定
                // こういうときはHSVを使うのが便利です
                //cc.hsv(Col, 1, 1);
                cc.hsv(c, 1, 1);
                var color:uint=cc.value32;
                //trace(color);
                for (var j:int=0; j < 15; j++)
                {
                    // x, y, z を l~mの範囲で散らします。
                    // l~mの区間の乱数を出す計算:(m - l) * Math.random() + l
                    px = new Pixel3D(color, xx * ((m - l) * Math.random() + l), yy * ((m - l) * Math.random() + l), zz * ((m - l) * Math.random() + l));
                    pixels.addPixel3D(px);
                    _jPixel += 1;
                }
                //大体これくらいで初期化と
                if (c > 2147483640) {
                    c = 0;
                }
                c++;
            }
        }
        //巻き戻すよ
        private function RemoveP():void {            
            for (var j:int=0; j < 30; j++)
            {                
                pixels.removePixel3D(px);
                _jPixel -= 1;
            }
        }
        
        
    }
}