box2d中的交叉点无法正常工作

时间:2014-10-05 23:55:08

标签: c++ box2d

我正在尝试使用此处的代码

http://www.iforce2d.net/b2dtut/raycasting

所以我可以知道一条线是否越过了box2d对象。它的一半工作,因为当线穿过对象时它确实显示为交叉点,但是,如果在对象之前单击,它仍然显示为交集,就好像它不知道线在对象之前停止。从阅读有关此代码的内容来看,它不应该这样做。

以下是该问题的屏幕截图。

enter image description here

这是我用于检查的方法

-(b2Vec2)rayCheckWithInput:(b2Vec2)p1 andX:(b2Vec2)p2
{
    b2RayCastInput input;
    input.p1 = p1;
    input.p2 = p2;
    input.maxFraction = 1;

    //check every fixture of every body to find closest
    float closestFraction = 1; //start with end of line as p2
    b2Vec2 intersectionNormal(0,0);
    //for (b2Body* b = self.world.world->GetBodyList(); b; b = b->GetNext()) {
        for (b2Fixture* f = box.body->GetFixtureList(); f; f = f->GetNext()) {

            b2RayCastOutput output;
            if ( ! f->RayCast( &output, input, 0 ) )
            {
                NSLog(@"Not Intersected");
                continue;
            }
            if ( output.fraction < closestFraction ) {
                closestFraction = output.fraction;
                intersectionNormal = output.normal;

                NSLog(@"Intersected");
                NSLog(@"%f %f,", output.normal.x, output.normal.y);
                NSLog(@"%f", output.fraction);
            }
            else{
                NSLog(@"Intersected2");
                NSLog(@"%f %f,", output.normal.x, output.normal.y);
                NSLog(@"%f", output.fraction);

            }
        }
    //}

    b2Vec2 intersectionPoint = p1 + closestFraction * (p2 - p1);

    NSLog(@"I point %f, %f", intersectionPoint.x, intersectionPoint.y);

    return intersectionPoint;
}

我无法看到在该检查中我如何判断点击点是否在鸟类之前(没有交叉点)或超出(交叉点),无论这些可能性如何,它似乎都会给出相同的结果。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这是测量单位的问题:你应该将p1和p2坐标(像素或点)转换为box2d坐标(米)。