forked from: forked from: レインボーロード! forked from: nengafl
ウソ宇宙
PV3Dで簡単に綺麗な図形を作ってみよう!
PV3Dを使うと3Dを超簡単に扱えます。
そこで、PV3Dで簡単に綺麗な図形を作ってみましょう。
簡単な数式とパラメータだけで綺麗な図形が完成!
下で定義してある定数のp, q, a, l, m をいじってみてください。
また、for文の中の数式を書き換えるとさらに形が変わります。
単純に、sin → cos みたいに書き換えてみてもおもしろいかも!
/**
* Copyright hacker_3i_5j3ct ( http://wonderfl.net/user/hacker_3i_5j3ct )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/kMaK
*/
// forked from deform's forked from: レインボーロード! forked from: nengafl
// ウソ宇宙
// 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=553;
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*110,
y*150,
Math.sin(i)*50
);
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;
}
}
}