【发布时间】:2012-08-20 15:26:22
【问题描述】:
这是有问题的代码:
public void calculate() {
// Center of circle is at (250, 250).
//THIS ALGORITHM IS NOW PROVEN TO BE WORSE THAN I FEARED...
/* What it does:
* Moves object around in a circle.
* Does not move the object towards the center.
* Object always stays on the rim of the circle.
*
* Algorithm I used. (DOES NOT WORK):
* N is normalized vector.
* R = -2*(V dot N)*N + V
*/
vx += Accelero.X * 0.1;
vy += Accelero.Y * 0.1;
double nx = x - 250;
double ny = y - 250;
double nd = Math.hypot(nx, ny);
if (nd == 0)
nd = 1;
nx /= nd;
ny /= nd;
double dotProduct = vx * nx + vy * ny;
vx += (float) (-2 * dotProduct * nx);
vy += (float) (-2 * dotProduct * ny);
x -= vx * 2;
y -= vy * 2;
vx *= 0.99;
vy *= 0.99;
}
这就是发生的事情。
您看到的黑线是紫色对象(框)移动的位置。它恰好在我用Canvas.drawCircle() 画的圆线上。
我不明白为什么反射不起作用。如果一个物体要撞到圆形墙,它不应该反映物体的速度方向,这就是算法的本意吗?还是我使用了错误的算法?
感谢任何帮助。提前致谢。
【问题讨论】:
-
你的初始条件是什么?轨迹究竟是如何从它们演变而来的?如果您从篮筐开始,那将是圆点所在的位置,但如果您从中心开始,那么在接触篮筐时必定会发生某事。会发生什么?
-
你在公式中丢失了一个减号。
-
@MarkoTopolnik 如果我从圆圈内开始,物体将越来越靠近中心,然后快速旋转。它一直在旋转,直到我给出的摩擦力停止了物体的速度。如果我让物体朝着给定方向加速,物体最终会到达一个点,它的加速度和速度使物体在圆形边缘,无论物体是否在圆圈之外.我会告诉你更多,但它会变得越来越奇怪。
-
@n.m.真的???我没看到。我遵循了代码注释部分中给出的算法,并且在代码中没有看到与算法不匹配的任何内容。如果您的意思是速度减去位置,那部分是正确的。有一些 API 使用反向轴,我正在使用其中一个 API。
-
WTF?!?!今天,我只是 $%#% 意识到我是多么愚蠢。此算法适用于圆到对象、在圆外并从外部撞击圆、碰撞响应。更糟糕的是,这个算法比 PDF 版本要好,这在我比较两者时是出乎意料的。伙计,我很生气,并意识到我在这一切之前浪费了几个月的工作,现在我痛苦地哭了。
标签: java collision-detection game-physics