波模様


エフェクト処理に波状面を追加
こちらからどうぞ
ソースは右クリックで


実装はしてみたけどアルゴリズムが難しくてよく分からない・・・


ソース

private var lx:Number = -1.0, ly:Number = -1.0, lz:Number = 1.0;
private var mil:Number = 130;	/*ハイライト(1..400)*/
private var env:Number = 30; /*環境光(1..100)*/

/*
   光源ベクトルを単位ベクトルに補正する
*/
private function adjustLightSourse():void
{
	var abl:Number;

	abl=Math.sqrt(lx*lx+ly*ly+lz*lz);
	lx=lx/abl;
	ly=ly/abl;
	lz=lz/abl;
}

/*
   陰影付け
   (dx,dy,dz)を法線ベクトルとする(単位ベクトルでなくてもよい)
   (パラメータx,y,zは将来拡張用.現行未使用)
*/
private function lighting(g:int, dx:Number, dy:Number, dz:Number, x:Number, y:Number, z:Number):int
{
	var cosT:Number, cosT2:Number;
	var rx:Number, ry:Number, rz:Number;
	var abl:Number;
	var env2:Number;
	var res:int;

	//法線ベクトルを単位ベクトルに補正
	abl=Math.sqrt(dx*dx+dy*dy+dz*dz);
	dx=dx/abl;
	dy=dy/abl;
	dz=dz/abl;
	cosT=dx*lx+dy*ly+dz*lz;
	rz=2.0*cosT*dz-lz;
	if(rz>0.0)
		cosT2=rz*rz*rz*rz*rz*rz*rz*rz*rz*rz*rz*rz;// n=12;
	else
	    cosT2=0;
	if(cosT<0.0) cosT=0.0;
	env2=env*255.0/100.0;
	res=int((cosT*255.0+env2)*Number(g)/255.0);
	if(res>g) res=g;
	res+=(mil*cosT2);
	if(res>255) res=255;
	if(res<0) res=0;
	return res;
}


private function getRefOrg(dx:Number, dz:Number, h:Number, ref:Number):Number
{
	var sinA:Number, tanA:Number;
	var sinB:Number,tanB:Number;
	var rA:Number;
	var res:Number;

	rA = Math.sqrt(dx*dx+dz*dz);
	sinA = -dx/rA;
	tanA = -dx/dz;
	sinB = ref*sinA;
	tanB = Math.sqrt(1.0/(1.0-sinB*sinB)-1.0);
	if(dx > 0.0) tanB = -tanB;
	res = (tanA-tanB) / (1.0+tanA*tanB);
	return h*res;
}

private function shade_wave(ampint:int, wwint:int, refint:int, vert:int):void
{
	if(target_bmpData == null) return;
	bmpData2 = new BitmapData(target_bmpData.width, target_bmpData.height);
	
	var val:int;
	var x:int, y:int;
	var xx:int, yy:int;
	var rr:int, gg:int, bb:int, oo:int;
	var endn:int;
	var col:Color = new Color(), pixb:Color = new Color(), ncol:Color = new Color();
	var rate:int;
	var smx:int;
	var amp:Number, ww:Number;
	var tmp:int;
	var adr:int;
	var mask_pat:Array = [], mask_sum:int, max_val:int;
	var gotu_do:int;
	var gotu:Array = [];
	var bx:int ,by:int;
	var dx:Number,dy:Number, dy2:Number, dz:Number;
	var ref:Number, ddx:Number, ddy:Number;
	var kH:Number;
	var x1:int, y1:int, x2:int, y2:int;

	x1 = 0;
	y1 = 0;
	x2 = bmpData2.width-1;
	y2 = bmpData2.height-1;

	amp = Number(ampint)/100.0;
	ww = Number(wwint);
	ref = Number(refint)/100.0;
	adjustLightSourse();
	
	for(y = y1; y <= y2; y++) {
		for(x = x1; x <= x2; x++) {
			if(!vert) {
				dx= 0.0;
				dy= -Math.PI*2/ww*amp*Math.cos(Math.PI*2/ww*Number(y-y1));
				dz= 1.0;
				kH= amp*(Math.sin(Math.PI*2/ww*Number(y-y1))+1.0)+10.0;
			}
			else {
				dx= -Math.PI*2/ww*amp*Math.cos(Math.PI*2/ww*Number(x-x1));
				dy= 0;
				dz= 1.0;
				kH= amp*(Math.sin(Math.PI*2/ww*Number(x-x1))+1.0)+10.0;
			}
			ddx = getRefOrg(dx,dz,kH,ref);
			ddy = getRefOrg(dy,dz,kH,ref);
			col.color = target_bmpData.getPixel(int(x+ddx),int(y+ddy));	//画像上の画素情報を取得
			rr = lighting(col.r,dx,dy,dz,Number(x-x1),Number(y-y1),0.0);
			gg = lighting(col.g,dx,dy,dz,Number(x-x1),Number(y-y1),0.0);
			bb = lighting(col.b,dx,dy,dz,Number(x-x1),Number(y-y1),0.0);
			col.r = rr;
			col.g = gg;
			col.b = bb;
			bmpData2.setPixel(x,y,col.color);	// 画像に値をセットする
		}
	}
	
	view.bitmapData = target_bmpData = bmpData2;
	myImage.width = view.width = myImage.width;
	myImage.height = view.height = myImage.height;
}