3

我是 Java 的新手,但决定制作一个有一堆弹跳的应用程序。请记住,我对法线几乎一无所知,我已经看到在这种线程中提到了很多。我也只学过代数1,并且知道一点三角(正弦、余弦和正切)。无论如何...

我已经覆盖了碰撞检测,使用
if (java.awt.geom.Point2D.distance(X1, Y1, X2, Y2) < ball1.radius + ball2.radius) {return true;} else {return false;}

if (ball.x + ball.radius > getWidth) {COLLISION}

依此类推,适用于所有四面墙

我需要做的是以半现实的方式处理这些碰撞,而不是切换速度和方向。

一切都在 JPanel 中绘制

提前感谢您的帮助

4

2 回答 2

4

您将必须了解法线是什么才能计算 collison 上的反射向量。幸运的是,这并不难理解。对于那里的数学头脑,我会有点不精确,所以请不要因为它而殴打我。:)

法线只是一个与表面正交(成 90 度角)的单位向量(单位:大小 = 1)。您可以将法线可视化为直接伸出曲面的箭头。由于您的墙壁没有倾斜,因此很容易找出它们的法线(假设屏幕的左上角为 0,0):

top: (0,1)
bottom: (0,-1)
left: (1,0)
right: (-1,0)

我们需要做的是获取你的球的速度并沿着你击中的墙壁的法线向量“反射”它。反射公式如下:

V2 = V1 - 2*N*(N.dot(V1))

其中 V1 是您的入射矢量(在这种情况下是您的旧速度),N 是我们撞到的墙壁的法线,V2 是您的反射矢量(您的新速度)。“N.dot(V1)”是N和V1的“点积”,也就是(Nx V1.x + Ny V1.y)。

一张来自 Wikipedia 的图片,展示了我们正在做的事情(P 是入射矢量,Q 是反射矢量):

替代文字

这是伪代码中的全部内容:

float nx = 0, ny = 1; // replace these with the normal of the wall you hit
float ix = ball.vx, iy = ball.vy; // incident vector
float dotprod = (nx*ix + ny*iy); // the dot product i mentioned earlier

ball.vx = ix - 2*nx*(dotprod);
ball.vy = iy - 2*ny*(dotprod);

让我知道是否有任何不清楚的地方。:) 另外,虽然这对墙壁来说有点矫枉过正,但当你进行球-球碰撞时,你需要计算法线,所以这并不是完全浪费......

于 2010-07-11T01:56:13.707 回答
1

您可能会喜欢文章2-Dimensional Elastic Collisions without Trigonometry,其中讨论了使用向量的弹性碰撞。这个动力学模型在 Java 中实现了该方法。

于 2010-07-11T03:28:18.860 回答