java - 想让物体在圆内弹跳,结果却让物体沿着圆的边缘移动

标签 java collision-detection game-physics

这是有问题的代码:

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;
    }

这就是发生的事情。

Picture.

您看到的黑线是紫色物体(盒子)移动的位置。它恰好位于我用 Canvas.drawCircle() 绘制的圆线上。

我不明白为什么反射不起作用。如果一个物体要撞击圆形墙壁,它不应该反射(reflect)物体的速度方向,这就是算法的目的吗?或者我使用了错误的算法?

感谢任何帮助。提前致谢。

最佳答案

你能从任意角度的直墙上弹跳吗?这应该是第一步。 (您可能会发现速度 vector 的极坐标表示更容易使用。)

一旦你完成了这个工作,它应该相当简单:从圆上反弹就像从接触点接触该圆的切线反弹一样。

您可以通过观察它垂直于接触点的半径 vector (即从对象所在位置指向圆心的 vector )来计算该切线

关于java - 想让物体在圆内弹跳,结果却让物体沿着圆的边缘移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12040547/

相关文章:

c# - 没有瓷砖 XNA 的 2D 游戏中的碰撞检测

java - 迁移 Xero oauth 1.0a 至 2.0 (JAVA)

java.net.SocketException : Connection reset

c++ - 即使在子弹模式下也能穿透物体

javascript - 在 Box2D 中禁用动态碰撞 : does not work when entity is already colliding

swift - 如何在 SpriteKit 的自上而下 View 中检测游戏结束无尽的 runner 游戏

javascript - 移相器 : add physics to graphic objects

java - 如何随机生成 75 - 100% 之间的数字?

java - Camel 文件序列号

actionscript-3 - 你如何使用 Actionscript 3.0 进行 "bouncing"碰撞检测? (有视频)