2012-01-03 4 views
0

私はランダムなプロジェクトを作成していますBox2dボディ。今私は、に基づいて行を描いていますDRAW方法でユーザーによってをTouchesMoved。私はそのラインとBOX2D団体との交点をチェックするBOX2D レイキャスティングメソッドを使用する必要があります。Box2DのRayCasting?

私は私のDrawメソッド

for(int i = 0; i < [pointTouches count]; i+=2) 
{ 
    CGPoint startPoint = CGPointFromString([pointTouches objectAtIndex:i]); 

    CGPoint endPoint = CGPointFromString([pointTouches objectAtIndex:i+1]); 

    ccDrawLine(startPoint, endPoint); 

    b2Vec2 start=[self toMeters:startPoint]; 

    b2Vec2 end=[self toMeters:endPoint]; 

    [self checkIntersectionbtw:start:end]; 
} 

-(void)checkIntersectionbtw:(b2Vec2)point1:(b2Vec2)point2 
{ 
    RaysCastCallback callback; 

world->RayCast(&callback, point1,point2); 

if (callback.m_fixture) 
{ 
    NSLog(@"intersected"); 
    checkPoint = true; 
} 
} 

-(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 

    UITouch *myTouch = [touches anyObject]; 

    CGPoint currentTouchArea = [myTouch locationInView:[myTouch view]]; 
    CGPoint lastTouchArea = [myTouch previousLocationInView:[myTouch view]]; 

    currentTouchArea = [[CCDirector sharedDirector] convertToGL:currentTouchArea]; 
    lastTouchArea = [[CCDirector sharedDirector] convertToGL:lastTouchArea]; 

    [pointTouches addObject:NSStringFromCGPoint(currentTouchArea)]; 
    [pointTouches addObject:NSStringFromCGPoint(lastTouchArea)]; 


} 

にそれのために以下のコードを使用していますが、完全に引かれた線が体を通過するときのコールバックは、交差点を伝えます。ユーザーが外側のある点から開始してbox2d本体の中にポイントを残すと、コールバックはその線が交差したとは言いません。私はおそらく何が間違っているのですか?

+0

レイキャスティングを使用してbox2d本体とタッチの接触を判別しましたか? – marciokoko

答えて

0

線や曲線を描いていますか?行については、最初に検出された点と検出された最後の点のみを使用すると仮定します。曲線の場合は、検出したすべての点を使用して、描いている曲線を形成します。

カーブを描く場合は、問題を理解していると思ってください。タッチシステムで検出された連続ポイントを使用して交差線を計算しています。これらの連続した点は非常に近接しており、非常に小さなレイキャストを作ります。ボール内に始点と終点を持つラインをキャストしている可能性があり、負の衝突が発生する可能性があります。

目的はあなたがボールに触れているかどうかを検出することであるならば、私はタッチの下で維持さセンサーを使用して、あなたの更新方法では、このコードとの衝突をチェックするお勧め:

for (b2ContactEdge* ce = sensorbody->GetContactList(); ce; ce = ce->next) 
{ 
    b2Contact* c = ce->contact; 

    if(c->IsTouching()) 
    { 
     const b2Body* bodyA = c->GetFixtureA()->GetBody(); 
     const b2Body* bodyB = c->GetFixtureB()->GetBody(); 

     const b2Body* ballBody = (bodyA == sensorbody)?bodyB:bodyA; 

     ... 


    } 
} 

あなたの場合は本当にレイキャストを使用したい場合は、小さなレイキャストを避けるために、いくつかの連続ポイントを保存し、ベクトルを作成することをお勧めします。

編集:申し訳ありませんが、私が書いた例はC++ですが、Objective-Cと同等のものを見つけることができます。

0

BOX2Dのraycastsは、彼らがヒットエッジが直面しているすべての「裏」を無視し、その光線は、固定具の内側に開始した場合、その固定具は、無視されます。最も簡単なことは、両方向で同じ光線を投げることです。