2012-05-23 75 views
0

我有一個傳感器,它將力量應用到在其邊界內移動的對象。我想確定一個物體是否觸摸了該傳感器的中心。如何確定box2d物體是否正在接觸傳感器的中心?

我可以很容易地檢測到物體是在裏面/觸摸傳感器還是其他物體,但我不確定如何檢查物體是否位於給定傳感器的中心。

編輯:傳感器實際上是一個漩渦,我在this question詢問。當物體接觸(或者實際上在或者在)傳感器時,它將力施加到它自己的中點上。當物體碰到中點時,我希望他們做一些事情,但我不確定如何檢查給定的物體是否觸摸/在傳感器的邊界內並觸摸其中點。

在下面的(很好繪製的)圖中,藍色的圓圈是傳感器,綠色的圓圈是身體,藍色的小點是中點。

enter image description here

更新:最後,我把傳感器在中間,並檢查爲 - 這是最簡單的方法。

+0

聞起來像Skitch。 Skitch非常棒。不過,我認爲你應該更好地解釋一下你的情況。 「界限」?這是否意味着「觸摸傳感器」?或者您是否手動檢查傳感器與物體之間的距離? –

+0

Skitch真棒!增加了更多有助於澄清事情的信息。 – glenstorey

+0

只需在中間放置另一個傳感器。 – iforce2d

回答

0

我認爲這會奏效。

  1. 將傳感器的世界位置轉換爲您想要測試的身體的局部點。
  2. 循環通過身體的所有燈具,並檢查您轉換的本地點是否在燈具中。
  3. 如果你找到一個,打破。否則它不會觸及身體的中心。

我在Objective-C也不好,所以我會在C++代碼例子寫:

bool checkForTouchingCenter(b2Body *sensorBody, b2Body *bodyToTest) 
{ 

    b2Vec2 sensorPosition = sensorBody->GetPosition(); 
    b2Vec2 localPosition = bodyToTest->GetLocalPoint(sensorPosition); 

    // An AABB check would be nice here, unless you test only the bodies that 
    // are already touching the sensor. 

    for (b2Fixture *fixture = bodyToTest->GetFixtureList(); fixture != 0; fixture = fixture->GetNext()) 
    { 
     if (fixture->TestPoint(localPosition)) 
     { 
      return true; 
     } 
    } 
    return false; 

} 

提示:那些已經觸摸傳感器只有測試機構。

+0

謝謝你的答案。你確定你的意思是sensorBody-> GetWorldPosition()?這不是一個b2Body的方法,似乎不起作用。 – glenstorey

+0

嘗試b2Body.GetPosition()。 –

+0

它看起來很有意義,我認爲你的邏輯非常好 - 但它不起作用。 – glenstorey

相關問題