Subscribe to RSS Feed ログイン

FLASH備忘6|ActionScriptやらWordPressやらを楽しむ会

Thursday
2010年9月09日

波動方程式を使ってTOTOのFLASHを再現したい。

 

TOTOのサイトの水面の断面図を再現しようと色々しらべて、ActionScript 3.0で実験していますが、なかなかうまくいきません。

screenshot.261

http://www.toto.co.jp/

どうやら波動方程式を応用するようで、とりあえず公式をActionScript 3.0にしてみました。

2次元波動方程式の数値計算例(C言語)

http://www.geocities.jp/supermisosan/secondwaveequation.html

しかし、式のどの部分をいじれば改良できるのか。まだまだ検討中です。

  

var N:int=100;
var tmax:int=3;
var c:Number=1;
var dt:Number=1;
var dx:Number=1.5;

var t:int=0;
var i:int;
var j:int;

//ステージを画面に100%表示 
stage.scaleMode=StageScaleMode.NO_SCALE;
stage.align=StageAlign.TOP_LEFT;

//二次元配列の作成
//二次元配列(二次元目
var subYs:Array = new Array();
for (j = 0; j < N; j++) {
 subYs.push(0);
}
//二次元配列(一次元目
var Ys:Array = new Array();
for (i=0; i<tmax; i++) {
 Ys.push(subYs);
}
var sps:Array = new Array();

for (i=0; i<N; i++) {
 var sp:Sprite = new Sprite();
 sp.graphics.beginFill(0xff0000);
 sp.graphics.drawCircle(0,0,2);
 addChild(sp);
 sps.push(sp);
}

//波の初期条件の決定
 for (i=0; i<N; i++) {
  if (30<i&&i<70) {
   Ys[0][i]=-150;
  } else {
   Ys[0][i]=0;
  }
  //trace(Ys);//fprint
  graphics.beginFill(0x000000);
  graphics.drawCircle(i*5, Ys[0][i]+stage.stageHeight*1/4,2);
 }
//マウスダウンのときに再初期化
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMD);
function onMD(e:MouseEvent):void {
 t = 0;
 for (i=0; i<N; i++) {
  if (0<i&&i<100) {
   Ys[0][i]=-550;
  } else {
   Ys[0][i]=0;
  }
  //graphics.beginFill(0x00ff00);
  //graphics.drawCircle(Math.random()*stage.stageWidth,Math.random()*stage.stageHeight,10);//fprint
 }
}
//n

//初期状態から次の状態を計算する
addEventListener(Event.ENTER_FRAME, onEF);

function onEF(e:Event):void {
 t++;
 if (t==1) {
  for (i=1; i<N; i++) {
   Ys[1][i]=Ys[0][i]+c*c/2*dt*dt/(dx*dx)*(Ys[0][i+1]+Ys[0][i-1]-2*Ys[0][i]);
  }
  Ys[1][0]=Ys[1][N-1]=0;//境界条件
  for (i=0; i<N; i++) {
   //trace(Ys);//fprintf
   graphics.beginFill(0x000000);
   graphics.drawCircle(i*5, Ys[1][i]+stage.stageHeight*2/4,2);
  }
 } else if (t>=2) {
  //以降の波の状態を計算する

  for (i=1; i<N; i++) {
   Ys[2][i]=2*Ys[1][i]-Ys[0][i]+c*c*dt*dt/(dx*dx)*(Ys[1][i+1]+Ys[1][i-1]-2*Ys[1][i]);
  }
  Ys[2][0]=Ys[2][N-1]=0;
  for (i=0; i<N; i++) {
   //trace(Ys);//fprintf
   sps[i].x = i*5,
   sps[i].y = Ys[0][i]+stage.stageHeight*3/4;
  }
  //n
  for (i=0; i<N; i++) {
   Ys[0][i]=Ys[1][i];
   Ys[1][i]=Ys[2][i];

  }
 }
}

コメント(1)続きを読む

Papervision3Dを使った3Dレースゲームを再現。すごすぎる

app.

Papervision3Dを使った3Dレースゲームを再現。すごすぎる

コメント(0)続きを読む

AS3.0ばね運動「ヨーヨー」再現。FLASH

祭りの風物詩の水風船ヨーヨーをAS3.0で再現してみました。

使っているのは「ばね運動」の物理法則です。

【特徴】

  • マウス位置とボールの位置を線で常に結びます。
  • スプリング係数と摩擦係数でバネの動きを再現しています。
  • 下向きに重力が掛かっています。

このスクリプトを白紙から記述していたら、addChildやらaddEventLitenerやらを書き忘れていました。書き忘れには注意。

var ball:Ball = new Ball(60, 0x66ccff);
var targetX:Number = stage.stageWidth/2;
var targetY:Number = stage.stageHeight/2;
var vx:Number = 10;
var vy:Number = 10;
var spring:Number = 0.1;
var friction:Number = 0.9;
var gravity:Number = 20;
addChild(ball);
addEventListener(Event.ENTER_FRAME, onEnterFrame);

function onEnterFrame(e:Event):void {
var dx:Number = mouseX - ball.x;
var dy:Number = mouseY - ball.y;
//バネ運動は加速の値に掛けます。
var ax:Number = dx * spring;
var ay:Number = dy * spring;
vx += ax;
vy += ay;
vx *= friction;
vy *= friction;
vy += gravity;
ball.x += vx;
ball.y += vy;
//コムバンドはマウスとボールを線でつなげて、フレーム毎に書き直しています。
graphics.clear();
graphics.lineStyle(2,0xff9900,0.5);
graphics.moveTo(mouseX, mouseY);
graphics.lineTo(ball.x, ball.y);
}

コメント(0)続きを読む