0

我对圆形碰撞有疑问,不是碰撞检测本身,而是解决碰撞的处理程序。

为了简单起见,我将使用两个圆圈。一个是半径为 50,另一个是 30。当圆圈相交时,这是处理程序所做的

//Calculates distance between circles
var nDistX:Number = CircleB.x - CircleA.x;
var nDistY:Number = CircleB.y - CircleA.y;
var nDistance:Number = Math.sqrt ( nDistX * nDistX + nDistY * nDistY );

//Gets the radius
var radiusA:Number = CircleA.width/2;
var radiusB:Number = CircleB.width/2;

//Calculates midpoint           
var midpointX:Number = ( CircleA.x + CircleB.x )/2;
var midpointY:Number = ( CircleB.y + CircleB.y )/2;

//Calculates the new position
CircleA.x = midpointX + radiusA * (CircleA.x - CircleB.x) / nDistance;
CircleA.y = midpointY + radiusA * (CircleA.y - CircleB.y) / nDistance;
MCBallB.x = midpointX + radiusB * (CircleB.x - CircleA.x) / nDistance;
MCBallB.y = midpointY + radiusB * (CircleB.y - CircleA.y) / nDistance;

当涉及具有相同半径的两个圆时,上面的代码可以完美地工作。当圆圈相交时(例如,在靠近每个坐标的坐标中产生),圆圈会彼此分开。

当圆圈有两种不同的大小时,问题就开始了。当它们相交时会发生什么,看起来较大的圆圈从较小的圆圈中跑出来,但仍然连接着。

你们中有人知道为什么会这样吗?

4

1 回答 1

0

我的脸被打了一巴掌。我忘记了当你有两个不同半径的物体时,你需要得到两者的平均值。所以万一有其他人有同样的问题。添加这个:

var averageRadius:Number = (radiusA + radiusB) / 2;

并将位置定位器替换为:

CircleA.x = midpointX + averageRadius * (CircleA.x - CircleB.x) / nDistance;
CircleA.y = midpointY + averageRadius * (CircleA.y - CircleB.y) / nDistance;
CircleB.x = midpointX + averageRadius * (CircleB.x - CircleA.x) / nDistance;
CircleB.y = midpointY + averageRadius * (CircleB.y - CircleA.y) / nDistance;
于 2013-08-06T16:31:52.813 回答