波模様
エフェクト処理に波状面を追加
こちらからどうぞ
ソースは右クリックで
実装はしてみたけどアルゴリズムが難しくてよく分からない・・・
ソース
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; }