2016-04-20 2 views
1

Ich portiere derzeit eine kleine Spiel-Engine auf Linux Ubuntu 14.04.4. Alles funktioniert gut, aber ich habe ein Problem mit Box2D festgestellt. Ich verwende Poly2Tri, um meine Formen zu triangulieren. Diese Bibliothek gibt Dreiecke entgegen dem Uhrzeigersinn zurück, die ich dann mit Box2D fixtures erzeuge.Box2D: Dreieck verursacht "Polygon ist degeneriert"

Einige Dreiecke arbeiten, aber zumindest eine nicht der Fall, das man zum Beispiel:

P1: (-0.135156, -0.042188) 
P2: (-0.136719, -0.050000) 
P3: (-0.131250, -0.053125) 

Wie Sie sehen können, dieses Dreieck ist gegen den Uhrzeigersinn. Wenn Box2D versucht, eine Form mit diesen Eckpunkten erstellen polygonShape->Set() verwenden, erhalte ich ein Polygon entartet assert ist:

/build/buildd/box2d-2.3.0+ds/Box2D/Box2D/Collision/Shapes/b2PolygonShape.cpp:158: void b2PolygonShape::Set(const b2Vec2*, int32): Assertion `false' failed. 

Ich habe mich gefragt, warum ich diese bekommen? Nach einigen Nachforschungen habe ich festgestellt, dass Polygone gegen den Uhrzeigersinn und nicht zu klein sein müssen (Koordinaten müssen größer als 0,00001 oder etwas sein), aber mein Dreieck respektiert beide Einschränkungen. Auch, es funktionierte gut unter Windows!

Es ist auch interessant zu bemerken, dass es scheint, dass diese Behauptung geworfen werden kann, wenn Box2Ds konvexer Hüllenalgorithmus auf dem Polygon bricht (oder so habe ich gehört).

Box2D Versionen:

  • auf Ubuntu: 2.3.0 + ds-2
  • Unter Windows: 2.3.0
+0

Wenn Sie den Quellcode von box2d haben, werfen Sie einen Blick auf Collision/Shapes/b2PolygonShape.cpp und sehen Sie, ob Sie herausfinden können, wonach es eigentlich sucht. – immibis

Antwort

1

Nach the source that I've found, b2PolygonShape::Set() werden die Scheitelpunkte miteinander verklebt werden, die nahe beieinander. Schließen bedeutet, dass die Quadratdistanz kleiner als die Hälfte von b2_linearSlop ist, die standardmäßig auf 0.005f festgelegt ist.

Das bedeutet, der Abstand ist weniger als sqrt(0.005f/2), also 0.05. Dies ist definitiv Ihr Fall, und Sie möchten vielleicht b2_linearSlop etwas kleiner definieren oder die Koordinaten der Punkte vergrößern.

Hinweis: Die Mathematik für die Vertex-Verklebung variiert von einer Box2D-Version zu einer anderen, aber dafür sorgen, dass Vertices weiter als 0.05f sicher sind.

+0

Ouh! Ja, ich ändere meinen Code, um mehr Punkte herauszufiltern. Allerdings hat meine Box2D-Version dies: 'if (b2DistanceSquared (v, ps [j]) <((0.5f * b2_linearSlop) * (0.5f * b2_linearSlop)))' – fordcars

+0

Scheitert es nicht, wenn die Abstand ist kleiner als '0,0025'? – fordcars

+0

@fordcars und was ist der Wert von 'b2_linearSlop' in Ihrer Box2D? –