如何使物体的速度降低而使其速度降低


11

我正在用Flash开发游戏,需要一些帮助。可以认为是数学问题。

我的物体飞速飞行,X我的物体可能与石头碰撞。当它与石头碰撞时,我需要我的物体打破石头并继续,但速度要慢一些。这很容易硬编码和写是这样的:myVelocity -= 10;,但我的主要问题是,我希望它输的速度越高,初始速度。

例如:如果速度为300,我希望它损失10,如果速度为200,我希望它损失20。

可以用某种公式来完成吗?


1
简单的东西怎么样log(myVelocity + 1) * N
乔纳森·康奈尔

Answers:


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年

恢复原状正在反弹。这是现实的。
马丁·考特

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
除非您希望达到特定的 “卡通物理学”效果,否则使用更逼真的系统几乎总是一个好主意。有几种更好的方法来确保您不会遇到潜在的引擎中断情况。
史蒂文·斯塔德尼克

1
我知道这个答案很好。但是我的游戏设置在卡通世界中,不需要现实。问问题时,我应该更具体一些。
Afra)

1
这是一个社区项目,人们在这里回答问题,对于提出的问题,这是最好的答案。仅仅因为您喜欢针对特定案例的hacky解决方案,并不意味着此答案不是最佳答案。通过选择骇人听闻的答案作为解决方案,当其他人在站点上搜索此类问题的答案时,他们将认为不切实际的答案是更好的答案。
理查德·法比安

1
@Richard另一个解决方案不是仅仅因为它不使用现实的物理原理而变得笨拙,还是因为块体不能顺利滑落而导致俄罗斯方块很笨拙?如果人们认为一个公认的答案是“更好”的答案,而不是认为这是满足要求的答案,那是他们的错。所有的答案和投票仍然显而易见。
CiscoIPPhone

2

您实际上并未提供足够的信息来告诉您想要哪种范围,例如,该范围是否有上限,是否需要几何级数等。

您要做的第一件事是得出一个与您要损失的速度成正比的数字(它不必相同,但应随着速度的增加而减小,以使其与损失成正比)。做到这一点的标准方法是倒数

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)行中所做的。

当然,还有其他方法可以解决整个问题,我敢肯定,在数学上比我更熟练的方法将在这里发布。


0

我认为,您可以仅使用简单的速度除法。例如:损失= 3000 / myVelocity。当速度为300时,您将损失10,而当速度为200时,您将损失15。这取决于您选择正确的常数。

如果需要,可以使用更复杂的公式,例如:常数/(常数2 *速度^ 2 +常数3 *速度)。同样,只需选择适合您的常量即可。


它完全颠覆了他的要求以及现实物理学中发生的一切。
Ali1S232 2011年

我不懂你 什么是反向的?
zacharmarz 2011年

我想我误会了你的回答,我不好。
Ali1S232
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.