跳ねるグラフの方程式?


7

基本的に、カメラを3Dで自動的に移動させたい。現在、私はどちらかと言えば直線的な動きをしているので、ばかげた動きをしたいと思います。

しかし、跳ねるための良い方程式は何ですか?y = sqrt(1 - x^2)つまり、あなたができる円の場合ですが、バウンスグラフがあるとすると、対応する数式はどうなりますか?absそれは「バウンス」しなければならないので、それは何かがあると思います。(私はこれをペイントで作りました)のようなもの: 跳ねるグラフ

そのようなグラフをもたらす良い方程式は何ですか?自分でできる変換とは思いますが、私は一種の方程式を探しています。


3
おそらく、次の行に沿って何かを使用できます:y = abs(cos(x * 5)* max(1-x、0))
Kromster

6
グラフィカルな方程式を使用しても、システムに自然に見える加速度を適用することはできません。ここで単純に基本的なニュートン方程式を使用するのがいかに簡単であるかに驚くかもしれません。オブジェクトに少しの質量と運動量を与え、重力とニュートンに加速度と位置の変化を処理させます。思ったよりずっと簡単です。
Steve H

1
@SteveH答えてください。
Notabene 2011年

@notabeneええ、私はそれでフェンスに座っていて、あなたは私をその側に押しました。ありがとう。疑似コードソリューションを提供するために15分を費やしたくなかったので、私はためらいました。
スティーブH

@クロム:ありがとう、私は現在持っています:y = abs(cos((x+18)/6.2)/((x+18)/6.2))*149。@SteveH:ニュートンの解法の重要な用語を教えていただけますか?それを実装する方法の良い例が本当に見つからないので、私は間違ったものを使用しているようです。
pimvdb 2011年

回答:


8

グラフィカルな方程式を使用しても、システムに自然に見える加速度を適用することはできません。ここで単純に基本的なニュートン方程式を使用するのがいかに簡単であるかに驚くかもしれません。オブジェクトに少しの質量と運動量を与え、重力とニュートンに加速度と位置の変化を処理させます。思ったよりずっと簡単です


あなたの答えで述べた方程式の例は素晴らしいでしょう:)
Kromster


2
以下に例を示します。xna.multigan.com / pastebin / ?page=view&id=1301401080 XNAで記述しましたが、疑似コードとしても読めると思います
Steve H

どうもありがとうございました!あなたは間違いなく受け入れられた答えであるべきです:)
pimvdb '29

1
これは私が(JavaScript)で終わったものです:jsfiddle.net/Cf9H4
pimvdb 2011年

4

直接的な答えを提供する代わりに、私はあなたを正しい方向に向けたいと思います。エンティティの移動にAIをググると、速度、質量、速度、加速などの変数を使用したアルゴリズムが見つかります。重力を方程式に追加すると、現実的な動作が得られるはずです。

質問へのコメントの1つで述べたように、それほど複雑ではありません。

私が非常に役に立ったと思うプログラミングゲームAIを勧めます。

跳ねるボールにかかる力を説明するこのリンクも見つけました。


2

動きがグラフのように見える場合は、次のようなバウンスイージング方程式を使用できます(source)。

// BOUNCE EASING: exponentially decaying parabolic bounce
easeOutBounce = function (t, b, c, d) {
    if ((t/=d) < (1/2.75)) {
        return c*(7.5625*t*t) + b;
    } else if (t < (2/2.75)) {
        return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
    } else if (t < (2.5/2.75)) {
        return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
    } else {
        return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
    }
};

easeInBounce = function (t, b, c, d) {
    return c - Math.easeOutBounce (d-t, 0, c, d) + b;
};

動きは次のグラフ(easeIn)に表示されます。 弾みやすさ


これはうまくいくと言わざるを得ません。どうやら、それは1つのグラフだけではなく、x^2バリアントの組み合わせです。私が使用する場合easeOutBounce(50, 0, 50, 50)、0〜50の範囲で、50ステップのバウンス効果が得られます。ありがとうございます。
pimvdb 2011年

1

跳ね返りたい場合は、反発係数を調べてください。カメラの「弾力性」を表す0〜1の値です。値0は、オブジェクトが地面に衝突しても跳ね返らないことを意味し、1は、カメラが地面に衝突した後、カメラが元の高さまで跳ね返ることを意味します(このシナリオでは)。

これを実装する最も簡単な方法は、カメラに初期速度ベクトルを与え(uと呼びます)、カメラが衝突した後の最終速度ベクトルを見つけたいとしましょう(これをvと呼びます)。CoR eと呼びましょう。

e = v / u

したがって、必要なのは、初期速度に係数を掛け、この速度を否定し(反対方向に移動するため)、出来上がりです。最終的な速度が得られ、衝突するたびにこれを続ければ、あなたの跳ねる動き。これは、跳ね返りたい平面があることを前提としています。衝突する複雑なメッシュがある場合は、ベクトルを無効にする代わりに、衝突するポリゴンの法線を掛けます(これは基本的に平面での否定の意味)。

ある種の位置更新機能(Euler、Verlet、またはRK4- このリンクを参照)を使用すると、このタスクが非常に簡単になります。

それが役に立てば幸いです(そして私の数学がそれほど遠くないことを願っています:P)


1

方程式を厳密に探しているが、バウンスを大まかに説明している場合は、以下を試すことができます。

y=(e^-x)*abs(4cos(5x))

どこ

  • 「4」は、落下とその後のバウンスの高さの係数です。
  • 「5」はバウンスの頻度であり、
  • 「abs」の部分は、バウンスの下部に鋭い軌道を与えることです。

いいね。なぜこれ以上賛成されないのですか?
JohannesA
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.