オブジェクトの速度が上がるにつれて速度が低下する方法


11

Flashでゲームを開発していますが、少し手助けが必要です。それは数学の問題と考えることができます。

オブジェクトが高速Xで飛んでいるため、オブジェクトが石と衝突する可能性があります。石にぶつかったときは、石を割って続行するための速度が遅いオブジェクトが必要です。ハードコードして次のように書くのは簡単ですmyVelocity -= 10;が、私の主な問題は、初期速度が高いほど速度を落とさないようにすることです。

たとえば、速度が300の場合は10を失い、200の場合は20を失います。

これはある種の式で行うことができますか?


1
のような単純なものはどうlog(myVelocity + 1) * Nですか?
ジョナサンコネル2011

回答:


6

私は速度を反転させ、あなたが好きなものを掛けます:

float velocity = 300.0f;
float collisionEffect = 3000.0f / velocity;
if (collisionEffect > velocity)
{
    // Choose which one you like: with or without restitution

    // No restitution
    collisionEffect = velocity;

    // Restitution
    collisionEffect = velocity + (collisionEffect - velocity) * 0.3f;
}
velocity -= collisionEffect;

この例はこれらの効果を与えます:

400 loses 7.5
300 loses 10
200 loses 15
100 loses 30
 50 loses 50  // Using no restitution
 50 loses 53  // Using restitution
 20 loses 20  // Using no restitution
 20 loses 59  // Using restitution

「返還」とは何ですか?
jprete 2011

反発は跳ねています。これは現実的です。
Martijn Courteaux 2011

30

あなたや他の人が説明するシステムは、実際の物理を生成しません。主な公式は、オブジェクトがどこかに当たったときは常に、数値によって0.5 * m * v ^ 2(運動エネルギー)を減らすことです。

したがって、重量が2Kgのオブジェクトがブロックにぶつかると、ブロックが壊れる前に16jのエネルギーが必要になります。オブジェクトの移動速度は次の表に従って変化します。

4  m/s -> the block will not break
5  m/s -> 3   m/s
6  m/s -> 4.4 m/s
7  m/s -> 5.7 m/s
8  m/s -> 6.9 m/s
9  m/s -> 8   m/s
10 m/s -> 9.1 m/s

7
これは受け入れられるべきです-正しく、現実的で、実装が簡単で、オブジェクトのすべてのケースを処理し、質量と速度をブロックします。
Tesserex、2011

3
あなたが達成したいと思っている特定の「漫画の物理」効果がない限り、より現実的なシステムで行くことはほとんど常に良い考えです。エンジンを破壊する可能性のあるエッジケースが発生しないようにするためのより良い方法はいくつかあります。
Steven Stadnicki

1
この答えは良かったと思います。しかし、私のゲームは漫画の世界に設定されており、現実的である必要はありません。質問をするとき、私はもっと具体的だったはずです。
Afra

1
これはコミュニティプロジェクトであり、人々は質問に答えるためにここにいて、尋ねられた質問については、これが最良の答えです。特定のケースでハックソリューションを好むからといって、この回答が最良の回答ではないという意味ではありません。ハックな答えをソリューションとして選択することにより、誰かがこの種の質問に対する答えをサイトで検索すると、非現実的な答えがより良いものであると想定されます。
Richard Fabian

1
@Richard他の解決策は、現実的な物理学を使用しないという理由だけでハッキングされていません。テトリスは、ブロックがスムーズに落ちないためにハッキングされていますか?人々がそれを質問者を満足させる答えであると仮定するのではなく、受け入れられた答えが「より良い」ものであると仮定する場合、それは彼らの責任です。すべての回答と投票はまだ明らかです。
CiscoIPPhone 2011

2

どの範囲の範囲が必要かを示すのに十分な情報が与えられていません。つまり、範囲が制限されているかどうか、幾何学的な進行が必要かどうかなどです。

あなたがしたい最初のことはあなたが失いたい速度の量に比例する数を導き出すことです(同じである必要はありませんが、あなたの損失に比例させるために速度が上がるにつれて減少するはずです)。これを行う標準的な方法は、逆数を取ることです。

temp = 1 / currentVelocity;

これで、100の場合は0.01、200の場合は0.005、300の場合は0.0033などになります。

次に、その数を乗算することで、その数を本当に必要なものに調整する必要があります。そう

k = 3000;
newVelocity = temp * k;

300の場合は20になりますが、10ではなく200の場合は15になります。これで十分な場合もあります。その場合、これ以上読む必要はありません。kは好きなように調整できますが、幾何学的な進行を実装したり、ベースを変更して増やしたりしない限り、希望する方法で数値を取得できない場合があります。ここでは幾何学的な進行については説明しませんが、ベースを変更する場合は、次のようにします。

base = 100;
temp = 1 / (currentVelocity - base);
if (temp < 0) temp = 0; //adjust temp so never less than zero, cannot gain force!

k = 2000;
velocityLoss= temp * k;
if (velocityLoss > currentVelocity) //(1) or make currentVelocity an unsigned int
    velocityLoss = currentVelocity; //(2)

これにより、質問で最初に求めた範囲が提供されます。300-> 10の損失、200-> 20の損失。FYI100-> 40の損失、および50-> 80(!)の損失減算を制限する必要があります-これは私が行(1)と(2)で行ったことです。

もちろん、この問題全体にアプローチする方法は他にもありますが、私よりも数学的に優れているものは、ここに掲載するはずです。


0

速度による単純な除算だけを使用できると思います。例:失われた= 3 000 / myVelocity。速度が300の場合、10を失います。200の場合、15を失います。正しい定数を選択するのは、あなた次第です。

必要に応じて、定数/(定数2 *速度^ 2 +定数3 *速度)などのより複雑な式を使用できます。繰り返しますが、定数を選択してください。


それは彼が要求したことと実際の物理学で何が起こるかとは完全に逆転しています。
Ali1S232 2011

わかりません。何が逆転しますか?
zacharmarz

私はあなたの答えを誤解していると思います、私の悪い。
Ali1S232 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.