[30分]完了キャンバスアニメーション|ゲームベース(5):加速度重力および摩擦シミュレーションに

序文

そのような重力や摩擦シミュレートの一般的な加速度として、当社の環境、いくつかの環境因子の必要性、より自然な動きを可能にするために、運動や衝突の問題を解決した後。
あなたがベースの前に置くように頼まれる前に、これをお読みください。
彼らは、批判を牛を議論する歓迎の人々に限られた能力を持っています。

重力加速度

【科学】物体の重力による重力加速度が加速度を有する場合です。また、gで表さ自由落下加速度、として知られています。鉛直下向き。一般にGで示される真空加速度に落下重力の作用によって地面近くに物体を指します。ほぼ標準値で計算を容易にするために通常980センチメートル/秒の二次または二次9.8メートル/秒であるとします。

実際のオブジェクトは、重力の重力加速度ので、品質である、と私たちのコンピュータ抽象オブジェクトや無品質、何の重力が存在しないすべての言った、我々は、単に物理的に重力加速度の概念を借りて言うためにここにいます実際に人定義される正のy軸加速度軸に向かう方向
実際には、実装が非常に簡単、正の加速度を設定することで、各時間はy軸上にプロットされたオブジェクトの速度に加算されます。
次の例では、ボールで、それは自動的に重力重力加速度によって分類されます、あなたはキーボードを使用することができ、下、左と四方にその加速を変更する権利。次のようにコアコードは:
完全例:重力加速度のデモ

(function drawFrame() {
  window.requestAnimationFrame(drawFrame, canvas);
  context.clearRect(0, 0, canvas.width, canvas.height);

  vx += ax;
  vy += ay;
  vy += gravity;
  ball.x += vx;
  ball.y += vy;
  ball.draw(context);
}());

アナログ摩擦

物体の相対運動(相対運動または傾向)を対向[ポピュラーサイエンス】力は、摩擦と呼ばれます。のオブジェクト(または相対運動の傾向)の摩擦相対運動の方向とは反対。別の目的は、物体表面滑り摩擦が呼び出される摺動接触摩擦の表面その妨げる相対運動との間で発生します。滑り摩擦接触面の大きさとサイズと圧力の大きさの粗。高い圧力は、接触表面粗い、摺動摩擦力が大きくなります。

前の例のようないくつかの非常に不自然なシーンがあるマウスの矢印に従う加速度によるは、決して理由である摩擦の様々な、との関係、停止していないが、現実(スペース例外)に動き、その結果、常に存在しています不可能なことが起こりました。
コンピュータ摩擦なし、我々だけでの物理シミュレーションの概念から学ぶ摩擦のシミュレーション力が、これは物理的な意味ではないことを覚えておいてください。

定義は、同様の摩擦人為所定の値であり、運動の方向に摩擦定義反対摺動、物体の速度がゼロカットに達し、それは動きの方向を変化させないアナログ。

注:オブジェクトの定義は、速度及び一定の大きさの値を減算し、速度ベクトルを減少させるために、X、Y軸にないことができます。物体が運動の角度に沿っている場合、オブジェクトは、アーバの速度がゼロに低減され、奇妙な現象は、他の軸の移動を継続します。

正しいアプローチ

私たちは、可変摩擦との摩擦をシミュレートしますランダムな例は、以下のようにコアコードは、プロセスを停止するために、スポーツから基本的な考え方をボールのスピードを発揮すると発表しました。

スピードと科学の割合は、[]二つの異なる概念です。速度は、大きさと方向を有するベクトルであり、純粋なオブジェクトの移動速度の速度、スカラー、無方向を指します。
  1. 二乗を合計した後、VX VYと、その後の進化の速度を求め、角度Math.atan2(VY、VX)を計算することにより得られます。
  2. シミュレーション率マイナス摩擦から、しかし率がマイナスになることはできません。
  3. 正弦および分解速度によって余弦関数とx軸とy軸の速度。

完全な例:摩擦のアナログ正しい計算

(function drawFrame() {
  window.requestAnimationFrame(drawFrame, canvas);
  context.clearRect(0, 0, canvas.width, canvas.height);
  // 先求速率
  let speed = Math.sqrt(vx ** 2 + vy ** 2);
  // 算出角度
  const angle = Math.atan2(vy, vx);
  // 判断运动是否停止
  if (speed > friction) {
    // 没有停止则减去模拟摩擦力
    speed -= friction;
  } else {
    speed = 0;
  }
  // 重新分解为x轴和y轴上的速度
  vx = Math.cos(angle) * speed;
  vy = Math.sin(angle) * speed;
  ball.x += vx;
  ball.y += vy;
  ball.draw(context);
}());

シンプルなアプローチ

正しいアプローチは面倒であり、それは、コンピューティングリソースの消費量が比較的大きくなるように、合成分解プロセスの再合成され、我々は、おそらく限り、それぞれが0~1すべての方向に速度を乗じているように、そのような正確なアプローチを必要としません番号の間に単に摩擦力の影響をシミュレートすることができます。だから我々は、DEFINE 摩擦係数をシミュレートします

摩擦係数の定義アナログ値は、人工的であり、物体が無限に近いゼロ速度に、それぞれの方向に動いているすべての方向に速度比を減少し続けます。

長い移動の速度は、XおよびY軸方向になるようにこの値を乗算することができるように正しい方法から変換の上記の例では、摩擦のアナログ摩擦係数として定義され、それは操作の数を減らす、0.9を指します。次のようにコアのコードは次のとおりです。
完全な例:アナログ摩擦正しい計算
注:1つの詳細がありますが、スピードと絶えず要因はスピードになります乗じ無限に近いが、0に等しくなく、無意味な計算を行うことを避けるために、あなたはスピードは少しのを持っているかどうかを判断することができます目に見えない価値、パフォーマンスを向上させます。

(function drawFrame() {
  window.requestAnimationFrame(drawFrame, canvas);
  context.clearRect(0, 0, canvas.width, canvas.height);
  // 判断速度大小以减少不必要的计算
  if (Math.abs(vx) > 0.001) {
    // 减少速度
    vx *= friction;
    ball.x += vx;
  }
  if (Math.abs(vy) > 0.001) {
    vy *= friction;
    ball.y += vy;
  }
  ball.draw(context);
}());

前の例を想起

おすすめ

転載: www.cnblogs.com/baimeishaoxia/p/11962314.html