Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-突破物理?_Java_Physics_Slick2d_Breakout - Fatal编程技术网

Java-突破物理?

Java-突破物理?,java,physics,slick2d,breakout,Java,Physics,Slick2d,Breakout,我正在创建一个突破游戏,我以前在这里问过一个问题,但没有提出解决方案。我有一个简单的物理模型来反转球与桨碰撞时的Y速度。 但我需要实现一个更先进的物理系统,例如,当球击中球拍的左侧和右侧时,等等。。。但我如何计算碰撞后球的方向?突破的标准是在与球拍左侧碰撞时将球指向左侧,如果碰撞是在右侧,则指向右侧,等等 我如何计算在哪里击球? 我有很多变量可以使用,比如桨叶的各个方面(宽度、高度、X位置)、球(半径、高度、宽度、X和Y速度、X位置、Y位置等等)我通过使用鼠标监听器,从旧的X位置减去新的X鼠标位

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

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

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


提前谢谢。

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

以下反弹方法计算并应用 速度和旋转因球的反弹而改变。
“系数”表示如何转换速度 x和y方向进入平行于曲面的速度。如果我们 调整视图方向,使球向下移动到表面, 如果移动方向为垂直,则平行于曲面的速度为正 对

这些方程式是根据下列物理分析得出的: Richard L.Garwin,“超弹性粗糙球的运动学”, 《美国物理学杂志》,3788-921969年1月。这就决定了 具有自旋的完全弹性球(弹性碰撞)的行为 弹跳时不会滑动。真实世界的模拟是 Wham-O的超级球产品

我们进行了两项修改/专门化: 1) 因为我们在二维空间中工作,所以我们的“球”是一个圆盘。这 产生转动惯量

1/2*M*R^2

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


如果您不喜欢这样的高级物理,并且满足于类似台球的行为,那么可以使用您最喜欢的方法计算碰撞点处的曲面法线(nx,ny)(按照nx²+ny²=1或nx=cos(a),ny=sin(a)进行赋范),并按照中的方式更改方向

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

球拍是矩形的吗?是的,我有它的位置坐标,还有我提到的,它的所有属性。所以如果球碰到矩形的垂直边,你只需要反转它速度的X分量;如果它碰到水平面,则反转Y分量。这就是你要问的吗?或者你是想处理桨在动的情况吗?还有。。。你想考虑球和桨的相对质量吗?换句话说,球到底撞到了桨叶还是桨叶足够重(球足够轻),以至于桨叶本身不受碰撞的影响?仅供参考,您拥有的每一条内联注释实际上都应该是单独方法上的javadoc注释。您在
bounce
函数中做的事情太多了,需要将其拆分为多个函数。@Ajmansfield哇。仅供参考,这是一个很小的方法。没有必要再打破它,因为它只做一件事。这是一个单一算法的实现。我们将不需要在程序中的任何其他地方重复使用该程序的任何部分。谢谢你的意见。
dot = nx*(vx-pvx)+ny*vy
vx = vx - 2*dot*nx
vy = vy - 2*dot*ny