我正在尝试了解二维世界中的碰撞检测。我最近得到了这个教程 http://www.gotoandplay.it/_articles/2003/12/bezierCollision.php .我有一个让我很困惑的问题 - 如果我尝试交换起点和终点,Flash 演示球会在没有响应的情况下掉落。 有人可以向我解释一下模拟是如何工作的吗? 我修改了这个示例代码。在交换起点和终点之前它工作完美,这是 objective-c 中的相同代码
提前致谢。 .
-(void)render:(ccTime)dt {
if(renderer)
{
CGPoint b = ball.position;
float bvx = ball.vx;
float bvy = ball.vy;
bvx += .02;
bvy -= .2;
b.x += bvx;
b.y += bvy;
float br = ball.contentSize.width/2;
for ( int p = 0 ; p < [map count] ; p++ ) {
line *l = [map objectAtIndex:p];
CGPoint p0 = l.end;
CGPoint p1 = l.start;
float p0x = p0.x, p0y = p0.y, p1x = p1.x, p1y = p1.y;
// get Angle //
float dx = p0x - p1x;
float dy = p0y - p1y;
float angle = atan2( dy , dx );
float _sin = sin ( angle );
float _cos = cos ( angle );
// rotate p1 ( need only 'x' ) //
float p1rx = dy * _sin + dx * _cos + p0x;
// rotate ball //
float px = p0x - b.x;
float py = p0y - b.y;
float brx = py * _sin + px * _cos + p0x;
float bry = py * _cos - px * _sin + p0y;
float cp = ( b.x - p0x ) * ( p1y - p0y ) - ( b.y - p0y ) * ( p1x - p0x );
if ( bry > p0y - br && brx > p0x && brx < p1rx && cp > 0 ) {
// calc new Vector //
float vx = bvy * _sin + bvx * _cos;
float vy = bvy * _cos - bvx * _sin;
vy *= -.8;
vx *= .98;
float __sin = sin ( -angle );
float __cos = cos ( -angle );
bvx = vy * __sin + vx * __cos;
bvy = vy * __cos - vx * __sin;
// calc new Position //
bry = p0y - br;
dx = p0x - brx;
dy = p0y - bry;
b.x = dy * __sin + dx * __cos + p0x;
b.y = dy * __cos - dx * __sin + p0y;
}
}
ball.position = b;
ball.vx = bvx;
ball.vy = bvy;
if ( b.y < 42)
{
ball.position = ccp(50, size.height - 42);
ball.vx = .0f;
ball.vy = .0f;
}
}
}
最佳答案
点的顺序定义了曲线上的方向。如果起点在左边,终点在右边,则曲线的方向是“向上”指向曲线上方。但是,如果交换起点/终点,则曲线方向相反,因此现在“向上”实际上指向曲线下方。
当您的代码检测到碰撞然后更正速度时,它使用曲线的方向。这就是为什么当球掉落在起点/终点互换的曲线上时,它看起来像是跳过了曲线。
要更正此问题,您的碰撞解决代码应检查球在曲线的哪一侧(相对于曲线的方向),并相应地进行调整。
关于iphone - 线和点之间的二维碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3930051/