Java cos曲线地面上的编码弹跳球

Java cos曲线地面上的编码弹跳球,java,trigonometry,Java,Trigonometry,我正在制作一个游戏,其中世界是用cos函数生成的,它看起来是这样的: 在任意x点,我都可以用Game.getHeight(x)函数找到曲面的高度 现在我想做一个球员可以发射的球,它可以从地面正确反弹。我这样做的方式对大约5%的反弹有效(即其他人射向地面,以不切实际的角度反弹等)。我怎样才能改进它?我使用的代码: 球(子弹)类: 检查碰撞的游戏更新方法片段: if (bullet != null) { bullet.update(gc, game, delta);

我正在制作一个游戏,其中世界是用cos函数生成的,它看起来是这样的:

在任意x点,我都可以用Game.getHeight(x)函数找到曲面的高度

现在我想做一个球员可以发射的球,它可以从地面正确反弹。我这样做的方式对大约5%的反弹有效(即其他人射向地面,以不切实际的角度反弹等)。我怎样才能改进它?我使用的代码:

球(子弹)类:

检查碰撞的游戏更新方法片段:

if (bullet != null) {

            bullet.update(gc, game, delta);
            for (float x = bullet.getX() - bullet.radius; x <= bullet.getX()
                    + bullet.radius; x++) {
                if (Point2D.distance(x, getHeight(x), bullet.getX(),
                        bullet.getY()) <= bullet.radius) {
                    float angle;
                    angle = (float) (Math.atan2(getHeight(x - 1)
                            - getHeight(x + 1), -2));

                     angle += (angle - bullet.getDirection());

                    bullet.setTrajectory(angle);
                    if (bullet.destroy()) {
                        bullet = null;
                    }
                    break;
                }
            }
if(bullet!=null){
bullet.update(gc、游戏、delta);

对于(float x=bullet.getX()-bullet.radius;x考虑到您的第一个问题可能是子弹与地面之间的碰撞检测,所以当我做类似的事情时,帮助很大

就反作用力而言,它取决于你希望它看起来有多逼真。如果你想得到合理的准确度,我建议你查阅运动方程,以及与物体有关的东西


如果你不想那么精确,请计算你击中曲面的角度,将与曲面的切线设置为0度,并反转关于平面法线的向量,因为你的第一个问题可能是子弹和地面之间的碰撞检测,所以当我做类似的事情时,帮了我很大的忙

就反作用力而言,它取决于你希望它看起来有多逼真。如果你想得到合理的准确度,我建议你查阅运动方程,以及与物体有关的东西


如果希望精度较低,请计算撞击曲面的角度,将与曲面的切线设置为0度,并反转与平面法线有关的向量。角度的计算方式似乎是正确的,但这并不是您需要做的全部:

  • 求碰撞点处曲面的角度
  • 找到该角度的法线(垂直角度)
  • 找到法向量和球的运动向量之间的“长度”值
  • 将此长度与表示曲面“弹性”的某个系数一起应用于向量
  • 代码如下:

    angle += Math.PI / 2
    
    PointF normal = new PointF(Math.cos(angle), Math.sin(angle));
    float length = oldMovmentVector.x * normal.x + oldMovmentVector.y * normal.y;
    
    newMovementVector = new PointF();
    newMovementVector.x = oldMovmentVector.x - (1 + bounciness) * (length) * normal.x;
    newMovementVector.y = oldMovmentVector.y - (1 + bounciness) * (length) * normal.y;
    
    // bounciness is between 0 and 1
    // newMovementVector is the new movement vector for your ball.
    

    这应该可以让你开始了。

    看起来你选择角度的方式是正确的,但这并不是你需要做的全部:

  • 求碰撞点处曲面的角度
  • 找到该角度的法线(垂直角度)
  • 找到法向量和球的运动向量之间的“长度”值
  • 将此长度与表示曲面“弹性”的某个系数一起应用于向量
  • 代码如下:

    angle += Math.PI / 2
    
    PointF normal = new PointF(Math.cos(angle), Math.sin(angle));
    float length = oldMovmentVector.x * normal.x + oldMovmentVector.y * normal.y;
    
    newMovementVector = new PointF();
    newMovementVector.x = oldMovmentVector.x - (1 + bounciness) * (length) * normal.x;
    newMovementVector.y = oldMovmentVector.y - (1 + bounciness) * (length) * normal.y;
    
    // bounciness is between 0 and 1
    // newMovementVector is the new movement vector for your ball.
    

    这应该让你开始了。

    如果你需要物理模拟在数学上精确,你需要解一个方程来找到球的轨迹和地面之间的交点,然后你需要找到地面曲线的导数,然后你可以通过插入来找到交点处曲线的梯度交点到地面导数的坐标。一旦你找到梯度,你需要在碰撞点的法线上反射球。你需要在碰撞时找到球的速度,然后在碰撞点上反射球的速度。法线垂直于梯度。I如果你想要像大多数真实世界碰撞那样的非弹性碰撞,那么你也需要一个乘法器来减小反弹后的速度。对于额外的点,你应该考虑到球在碰撞后很快会在一个迭代/时间步内发生碰撞。
    如果你只需要让反弹看起来足够真实,但不需要数学上精确,你可以通过找到碰撞点左右几个像素处的曲线高度来找到梯度,并找到差异。同样,你需要找到法线并反映法线的速度。

    如果y你需要物理模拟在数学上精确,你需要解一个方程来找到球的轨迹和地面之间的交点,然后你需要找到地面曲线的导数,然后你可以通过将交点的坐标插入到地面的导数。一旦你找到梯度,你需要在碰撞点的法线上反射球。你需要在碰撞时找到球的速度,然后在碰撞点上反射球的速度。法线垂直于梯度。如果你想像大多数rEHE世界碰撞,你也需要一个乘法器来降低反弹后的速度。对于额外的点,你应该考虑球可能碰撞后不久在一个单一的迭代/时间步长碰撞。< /P>
    如果你只需要让反弹看起来足够真实,但不需要精确到数学上,你可以通过找到碰撞点左右几个像素处的曲线高度来找到梯度,并找到差异。同样,你需要找到法线并反映法线的速度。

    什么你关心的是地面的。当球与该片中的世界碰撞时,你使用球的轨迹和曲面的法线,并使用该信息进行计算

    你应该能够提前计算。你可以将世界分割成一组n像素宽的长方体(2d数组或四叉树),每个长方体都小于球的直径,然后计算每个长方体的平均法线

    如果你能侥幸逃脱的话,切片有很多好处。你需要不止一个接触点来计算表面方向并准确地弹起球。对盒子进行预计算可以让你做一个si