计算碰撞角度

时间:2014-12-22 08:38:16

标签: java swing collision-detection java-2d

我正在创建一个简单的物理引擎。基于一些先前的矢量演算知识,我在这里编写了这个代码,它采用瞬时方向矢量“u”的x和y分量以及矢量的x和y分量,即球与“v”碰撞的线和返回一个双'theta',即传入球和线之间的角度。

private double computeAngle(double uXComponent, double uYComponent, 
        double vXcomponent, double vYComponent) {
    return Math.acos( ( (uXComponent * uYComponent) + (uYComponent * vYComponent) ) / ( Math.sqrt( (uXComponent * uXComponent) + (uYComponent * uYComponent) ) * Math.sqrt( (vXcomponent * vXcomponent) + (vYComponent * vYComponent) ) ) );
}

程序继续使用此代码来确定新的速度分量。

xVelocity *= Math.cos(theta);
yVelocity *= Math.sin(theta);

然而,如果线是平的,即v =< 500,0>并且球以简单的抛物线曲线移动并且在线上反弹,第一次反弹总是直线上升(xVelocity非常接近0)。基本上theta的值非常接近pi / 2(比实际应该更接近)。

我确信有一种更好的方法可以通过使用点积来做到这一点。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

碰撞基本上归结为动力和弹性。但是,如果你愿意,完全可以忽略弹性。有许多资源可以更多地了解动量守恒,包括this网站,其中有讲义。 (完全披露,我现在正在解释,所以去读一读)。

物质m1以速度v1移动的物体,与质量为m2的另一物体碰撞,角度θ为速度v2,可以模拟为在这些等式中碰撞。

m1*v1 + m2*v2*cos(theta) = (m1 + m2) * v3 * cos(phi) //This is for the x axis
m1*v1 + m2*v2*sin(theta) = (m1 + m2) * v3 * sin(phi) //This is for the y axis

在这些等式中,v3是合成质量的最终速度,phi是合成行进角。请注意,这是一个完全非弹性的碰撞,因此这两个对象形成一个。

This SO answer讨论如何计算墙外的反弹角度。实质上;给定与轴对齐墙碰撞的速度,将给定坐标乘以-1。鉴于我此刻只是逐字复制,我只想说按照链接,如果有效,那么这个问题就是重复。

答案 1 :(得分:0)

我的代码中的错误是一个简单的逻辑错误。两个向量之间角度的公式是 formula for angle between vectors

我的代码是

Math.acos( ( (uXComponent * uYComponent) + (uYComponent * vYComponent) ) / ( Math.sqrt( (uXComponent * uXComponent) + (uYComponent * uYComponent) ) * Math.sqrt( (vXcomponent * vXcomponent) + (vYComponent * vYComponent) ) )

它应该是

Math.acos( ( (uXComponent * vXComponent) + (uYComponent * vYComponent) ) / ( Math.sqrt( (uXComponent * uXComponent) + (uYComponent * uYComponent) ) * Math.sqrt( (vXComponent * vXComponent) + (vYComponent * vYComponent) ) )

(在矢量的点积中,我需要校正v和u矢量的x分量的乘法)