2011-12-31 14 views
2

私は飛行する矢印のシミュレーションをしていますが、それはとても自然に見えません。ここで 矢印の軌跡

はスクリーンショットです:

enter image description here

矢印ムービークリップのアンカーは、あなたが見ることができるように、矢印の前面にあるが、私は真ん中にそれを交換する場合、それはまだ見ていません完璧な、誰かがこのような何かの経験を持っていますか?

は、ここでも私のコードです:

//... 
//'math' isn't the default 'Math' class, it calculates some physics stuff. 

private function updateArrow() 
     { 
      var y0:Number = 50; 
      var v:Number = 100; 
      var angle:Number = math.getRadians(45); 

      if(!arrowstartposition) 
      { 
       arrowstartposition = activearrow.x; 
       arrowdistance = math.calcDistance(y0,v,angle); 
      } 

      var currentdistance:Number = Math.abs(activearrow.x - arrowstart); 

      if(currentdistance <= arrowdistance) 
      { 
       var currentvelocity:Number = math.calcVelocity(currentdistance, v, angle); 
       var addvalue:int = 1; //Math.round(currentvelocity/4); 

       activearrow.x += addvalue; 
       currentdistance += addvalue; 

       var arrowheight:Number = math.calcHeight(currentdistance,y0,v,angle); 
       var vx:Number = v * Math.cos(angle); 
       var vy:Number = - (v * Math.sin(angle) - 9.81 * (currentdistance/arrowdistance) * math.calcTimeOfFlight(y0, v, angle)); 
       var currentangle:Number = Math.atan2(vy,vx); 

       activearrow.y = y0 - arrowheight; 
       activearrow.rotation = math.getDegrees(currentangle); 
      } 
      else 
      { 
       arrowstart = undefined; 
       arrowdistance = undefined; 
       activearrow = null; 
      } 
     } 
+1

1つの問題は、軌跡があまりにも放物線であることです。正しい軌跡は、矢印の各部分のベクトルを使用することによってよりよくモデル化されます。ヘッドと硬材は重力と風の抵抗が少なく、シャフトの効果はほとんど無視でき、フレッチングはいくらかのリフトを経験します。したがって、9.81に基づく単純な放物線は、それを正しくモデル化しません。また、速度の連続的な関数であるドラッグがあります。 – drharris

+0

@drharrisしかし、最も物理的に正確ではないとしても、完全な放物線であれば、曲線の形状は最も自然に見えます。 – corsiKa

+0

真実ですが、彼はシミュレーションをしていると主張しました。シミュレーションでは通常、精度が効果以上になります。 – drharris

答えて

2

私は重力のあなたの中心がオフになっていると思います。矢頭は、重力の中心が矢のためのものではありません。さもなければそれは非常にうまく飛ばないでしょう。矢印の重心は飛行の放物線の接線になります。それで、その重心の周りを回転します。それをもっと矢印の中心に向かって動かしてみると、もっと自然に見えるようになります。まだ問題がある場合。単なる石を投げて、自然に見えるようにしてください。その後、矢印で戻ってください。それが石のように見える場合は、動きが正しいことを知っている矢印が悪いように見えますが、矢印はオフです。

+0

私はそれを「石」に変更しました。スピードに問題があるようです。各フレームに一定の値を加えますか?水平軸は時間単位を表します。または、現在の速度に基づいて値を追加しますか? ( 'currentvelocity/4'のような) –

+1

より自然な動きのために、あなたは加速し、減速させたいでしょう。一定の速度を使用するのではなく、時間の経過と共に変化させたいと思うでしょう。矢印が上に移動するにつれて、重力の影響を受けて放物線の高さに達すると、方向が変わり地球に落ちます。ゲートからは非常に高速のVy0が必要になります。フレームレート単位はフレーム/秒なので、フレームごとに-9.81 m/s^2 /フレームレートを追加します。水平軸はX方向、垂直軸はY方向になります。 -9.81はソリッドオブジェクトに当たったときに停止するY方向に作用します – chubbsondubs

+0

Vy = Vy0; //初期速度 Vx = Vx0; //これらはまた、いくつかのパワー* sin /cosθから計算され、ここでthetaは開始角度である。 while(stillInAir){ Vy = Vy-9.8/frameRate; Vx = Vx + windSpeed; } – chubbsondubs