回答:
私は速度を反転させ、あなたが好きなものを掛けます:
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
あなたや他の人が説明するシステムは、実際の物理を生成しません。主な公式は、オブジェクトがどこかに当たったときは常に、定数値によって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
どの範囲の範囲が必要かを示すのに十分な情報が与えられていません。つまり、範囲が制限されているかどうか、幾何学的な進行が必要かどうかなどです。
あなたがしたい最初のことはあなたが失いたい速度の量に比例する数を導き出すことです(同じである必要はありませんが、あなたの損失に比例させるために速度が上がるにつれて減少するはずです)。これを行う標準的な方法は、逆数を取ることです。
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)で行ったことです。
もちろん、この問題全体にアプローチする方法は他にもありますが、私よりも数学的に優れているものは、ここに掲載するはずです。
速度による単純な除算だけを使用できると思います。例:失われた= 3 000 / myVelocity。速度が300の場合、10を失います。200の場合、15を失います。正しい定数を選択するのは、あなた次第です。
必要に応じて、定数/(定数2 *速度^ 2 +定数3 *速度)などのより複雑な式を使用できます。繰り返しますが、定数を選択してください。
log(myVelocity + 1) * N
ですか?