Answers:
我会反转速度,然后乘以您喜欢的东西:
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的价格,但是您给200的15而不是10的价格。这对您可能很好,在这种情况下,您无需进一步阅读。您可以根据自己的喜好调整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。FYI 100->损失40,以及50->损失80(!),这意味着您需要限制您的减法-这就是我在第(1)和(2)行中所做的。
当然,还有其他方法可以解决整个问题,我敢肯定,在数学上比我更熟练的方法将在这里发布。
我认为,您可以仅使用简单的速度除法。例如:损失= 3000 / myVelocity。当速度为300时,您将损失10,而当速度为200时,您将损失15。这取决于您选择正确的常数。
如果需要,可以使用更复杂的公式,例如:常数/(常数2 *速度^ 2 +常数3 *速度)。同样,只需选择适合您的常量即可。
log(myVelocity + 1) * N
?