gpt4 book ai didi

Java - 突破物理学?

转载 作者:行者123 更新时间:2023-11-30 03:56:13 25 4
gpt4 key购买 nike

我正在创建一个打砖 block 游戏,我之前曾在这里提出过一个问题,但没有提出解决方案。我有简单的物理原理来反转球与 Racket 碰撞时的 Y 速度。但我要实现一个更先进的物理系统,例如,当球击中 Racket 的左侧和右侧等时......但是我如何计算碰撞后将球引导到哪里?突破中的标准是在碰撞到 Racket 左侧时将球引导到左侧,如果碰撞到右侧,则将球引导到右侧,等等...

如何计算击球位置?我有很多可以使用的变量,例如 Racket 的所有方面(宽度、高度、X 位置)、球(半径、高度、宽度、X) > 和 Y 速度、X 位置、Y 位置等...),我通过使用鼠标监听器并从旧的 X 位置减去新的 X 鼠标位置,这样我就可以看到桨移动的速度和方向。

这里有人熟悉基本物理并能够帮助我计算碰撞后发送球的轨迹、路径、速度或方向吗?!

提前致谢。

最佳答案

我们一直在为学校开发一款突破游戏。我们就是这样做的。请注意,这是来自 Ball 类,因此每次看到 this 都会想到 Ball

以下 Bounce 方法计算并应用速度和旋转因球的弹跳而变化。
“因素”表明如何转换速度x 和 y 方向转化为平行于表面的速度。要是我们调整我们的视角,使球向下朝表面移动,如果运动方向为平行于表面的速度为正对。

这些方程源自以下物理分析:Richard L. Garwin,“超弹性粗糙球的运动学”,《美国物理学杂志》,37, 88-92,1969 年 1 月。这决定了带有旋转的完美弹力球(弹性碰撞)的行为弹跳时不会打滑/滑动。现实世界的模拟是Wham-O 的 Superball 产品。

我们进行了两项修改/特化:1)由于我们在二维空间中操作,所以我们的“球”是一个圆盘。这使得转动惯量

1/2 * M * R^2

。在以下公约中Garwin的论文,这意味着alpha = 1/2。Garwin 不考虑与移动表面的碰撞。然而,通过考虑相对于物体的运动,很容易调整事情运动表面的框架。我们只需减去速度在计算什么之前从球的平行运动中得出表面发生在碰撞中,然后将速度加回来。

按照 Garwin 的表示法,我们最终得到:

Ca = -1/3 Cb - 4/3 Vb + 4/3 Vs

Va = -2/3 Cb + 1/3 Vb + 2/3 Vs

这里 Va 和 Vb 是球平行于表面的速度分别是碰撞后和碰撞前。 Vs 是速度表面。 Ca 和 Cb 是球的 R * 旋转(前后)分别发生碰撞。 (在加文的符号中,C = R * omega,其中 omega 是自旋。)

/*
@param xFactor an int, -1, 0, or 1, giving the factor by which to
multiply the horizontal speed to get its contribution to the speed
parallel to the surface
@param yFactor an int, -1, 0, or 1, giving the factor by which to
multiple the vertical speed to get its contribution to the speed
parallel to the surface
@param speed a double, giving the speed of the surface; positive
is movement to right if we consider the surface as being horizontal
with the Ball coming down onto it
*/
private void bounce (int xFactor, int yFactor, double speed) {
// can get stuck, so add a random component to the speed
speed += 0.03 * (random.nextFloat() - 0.5);
// obtain parallel / normal speeds for horizontal and vertical
double vParallel = xFactor * this.getHorizontalSpeed() +
yFactor * this.getVerticalSpeed();
double vNormal = xFactor * this.getVerticalSpeed() -
yFactor * this.getHorizontalSpeed();
double radius = this.getImage().getHeight() / 2.0D;
// determine Garwin's Cb and Vb
double cBefore = radius * spin;
double vBefore = vParallel;
// determine Garwin's Ca and Va
double cAfter = (-1.0D/3.0D) * cBefore + (-4.0D/3.0D) * vBefore + (4.0D/3.0D) * speed;
double vAfter = (-2.0D/3.0D) * cBefore + ( 1.0D/3.0D) * vBefore + (2.0D/3.0D) * speed;
// apply direction reversal to normal component
double vNAfter = -vNormal;
// determine horizontal and vertical speeds from parallel and normal components
double vHAfter = xFactor * vAfter - yFactor * vNAfter;
double vVAfter = xFactor * vNAfter + yFactor * vAfter;
// update the Ball's state
this.setHorizontalSpeed(vHAfter);
this.setVerticalSpeed(vVAfter);
this.spin = cAfter / radius;
}

关于Java - 突破物理学?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23119954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com