当前位置: 首页 > 知识库问答 >
问题:

Java-突破物理学?

闻人宇定
2023-03-14

我正在创建一个突破游戏,我之前在这里问了一个问题,但没有提出解决方案。我有一个简单的物理过程来反转球与桨碰撞时的速度。但我需要实现一个更先进的物理系统,例如,当球击中桨的左侧和右侧时,等等。。。但我该如何计算碰撞后球的方向呢?突破的标准是在与球拍左侧碰撞时将球指向左侧,如果碰撞是向右的,则指向右侧,等等。。。

我如何计算在哪里击球?我有很多变量可以使用,比如桨叶的各个方面(宽度、高度、X位置)、球(半径、高度、宽度、X和Y速度、X位置、Y位置等等)我用一个鼠标监听器,从旧的鼠标位置减去新的鼠标位置,得到了桨叶的运动,这样我就可以看到桨叶移动的速度和方向。

这里有谁熟悉基本物理,能帮我计算出碰撞后球的轨迹、路径、速度或方向吗?!

提前谢谢。

共有2个答案

沈皓君
2023-03-14

如果你不喜欢这样的高级物理,并且满足于台球般的行为,那么可以用你最喜欢的方法(nx²ny²=1或nx=cos(a),ny=sin(a))计算碰撞点的表面法线(nx,ny),并按中所示改变方向

dot = nx*vx+ny*vy
vx = vx - 2*dot*nx
vy = vy - 2*dot*ny

这是一个几乎静止的桨。对于一个移动的桨,按照建议做,首先从vx中减去桨速度pvx,计算点积和由此产生的变化,然后加回桨速度。或者在不改变vx的情况下只在点积中做减法:

dot = nx*(vx-pvx)+ny*vy
vx = vx - 2*dot*nx
vy = vy - 2*dot*ny
益何平
2023-03-14

我们一直在为学校准备突破赛。我们就是这样做的。注意,这是从一个Ball类中获得的,所以每次看到这个think Ball。

以下反弹方法计算并应用球反弹产生的速度和自旋变化。
“因子”指示如何将x和y方向的速度转换为平行于表面的速度。如果我们调整视野,使球向下朝着表面移动,如果运动向右,平行于表面的速度为正。

这些方程式来源于Richard L. Garwin发表的物理分析,“超弹性粗糙球的运动学”,美国物理学杂志,37,88-92,1969年1月。这决定了一个具有完美弹性的球(弹性碰撞)的行为,其旋转在弹跳时不会滑动/滑动。现实世界的模拟是Wham-O的Superball产品。

我们做了两个修改/专门化:1)由于我们在二维中操作,我们的“球”是一个圆盘。这使得转动惯量

1/2*M*R^2

. 在加温论文的惯例中,这意味着α=1/2。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*ω,其中ω是自旋。)

/*
@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。目前我已经把一切都做好了,但我注意到球似乎是朝着同一个方向飞的。 我已经对它进行了编程,当球碰到球拍时,Y速度是相反的。这是可行的,但球似乎遵循相同的路线。。。 如何让碰撞看起来更真实? 当球击中桨的左侧时,我想将其重新定向到左侧,但我不确定在哪个角度反射它。有人能提供一个公式来帮助我计算出当球接触桨的左侧或右侧时需要引导的角度吗?

  • 我正在读《java的艺术与科学:计算机科学导论》一书学习java。练习程序之一是创建突破游戏的简单克隆。 我目前能够加载游戏,但球的物理问题。我正在使用最简单的物理可能,不明白为什么它不起作用。 当球撞到墙上时,它会正常反弹,但当它撞到桨或砖块时,它不会。我在碰撞检测中使用相同的代码来更改我在墙上使用的方向。检测到碰撞后,我添加了一个println并观察了控制台处理碰撞事件的过程,但方向没有发生变

  • 问题内容: 递归是一种“分而治之”的样式,它在变小的同时会拆分(Tree数据结构),如果发现违规,我希望它完全中断,这意味着中断所有递归路径并返回true。这可能吗? 问题答案: 您可以返回错误代码,或修改一些全局变量,以便每个递归实例都知道可以“杀死自己”。 某种东西。

  • 当用户按下左右键时,我希望我的矩形停止。我研究了多个密钥处理,但无法找到任何东西。 谢谢你的帮助

  • 问题内容: 在我的代码中,我有一个for循环,迭代一个代码方法,直到满足for条件为止。 反正有没有打破这个for循环? 因此,如果我们看下面的代码,如果我们想在达到“ 15”时打破这个for循环,该怎么办? 我尝试了以下无济于事: 我尝试了一个循环: 我可以实现我想要的唯一方法是打破for循环,我不能暂时将其替换,如果要使用if语句。 编辑: 仅作为示例提供了此代码,这不是我试图将其实现的代码。