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: レインボーロード! forked from: nengafl

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

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

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

// ウソ宇宙

// forked from sake's レインボーロード!  forked from: nengafl
// 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 flash.geom.Point;
	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="60")]
	import flash.geom.ColorTransform;
	import flash.filters.BlurFilter;
	public class Nengafl extends BasicView
	{
		// 計算に使うパラメータ
		// このあたりを適当に変えてみるだけでも面白いです!
		//----------------------------------------------------------------
		private const p:int=3;
		private const q:int=7;
		private const l:Number=0.9;
		private const m:Number=1.1;
		private var a:Number = -1.4;
		private var b:Number = 1.6;
		private var c:Number = 1.0;
		private var d:Number = 0.9;
		//----------------------------------------------------------------
		
		private var i:Number = 0;
		private var t:Number = 0.2;
		private var difX:Number,
					difY:Number,
					oldX:Number,
					oldY:Number;
		
		private var pixels:Pixels;
		private var px:Pixel3D;
		private var canvas:BitmapData;
		private var mtx:Matrix;
		private var cTrs:ColorTransform;
		private var bFlt:BlurFilter;

		// コンストラクタ
		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;
			
			// キラキラロジック
			canvas=new BitmapData(465, 465, false, 0x000000);
			var bmp:Bitmap=new Bitmap(canvas, "never", true);
			addChild(bmp);
			mtx=new Matrix(1, 0, 0, 1);
			
			cTrs = new ColorTransform(0.95, 0.95, 0.99);
			bFlt = new BlurFilter(2, 2);

			Draw(3000);
			
			// PV3Dの描写開始!
			startRendering();

			// フレームイベント追加
			addEventListener(Event.ENTER_FRAME, onFrame);
		}
		
		private function Draw(n:int):void
		{
			var x:Number = 0;
			var y:Number = 0;
			var z:Number = Math.random()*300-150;
			var nx:Number;
			var ny:Number;
			var nz:Number;
			
			
			for(i = 0; i < n; i++)
			{
				nx = Math.sin(a*y)+c*Math.cos(a*x);
				ny = Math.sin(b*x)+d*Math.cos(b*y);
				x = nx;
				y = ny;
				px = new Pixel3D(
					0xffffffff,
					x*150,
					y*150,
					Math.sin(i)*350
				);
				pixels.addPixel3D(px);
			}
		}

		// フレームイベント用関数
		private function onFrame(e:Event):void
		{
			// キラキラを描写
			canvas.lock();
			canvas.applyFilter(canvas, canvas.rect, new Point(0, 0), bFlt);
			canvas.colorTransform(canvas.rect, cTrs);
			canvas.draw(viewport, mtx);
			canvas.unlock();

			// Y軸でローテーション
			pixels.rotationX += 0.2;
			pixels.rotationY += 0.2;
			pixels.rotationZ += 0.2;
		}
	}
}