Farseer-Physik: Möglichkeiten, einen Körper zu schaffen?

7

Ich möchte mit Farsser und Kinect etwas Ähnliches erstellen:

https://vimeo.com/33500649

Dies ist meine bisherige Implementierung:

http://www.youtube.com/watch?v=GlIvJRhco4U

Ich habe die Umrissscheitelpunkte und die Triangulation des Benutzers. Und im Anschluss an das Texture to Polygonmsample habe ich diese Linie verwendet, um die Form zu erstellen, wobei farseerObject eine Liste der Eckpunkte der Dreiecke ist:

_compound = BodyFactory.CreateCompoundPolygon (World, farseerObject, 1f, BodyType.Dynamic);

Aber ich muss den Körper jedes Frames aktualisieren (wie 30 fps) und das ist sehr langsam. Ich bekomme nur 2 oder 3 fps.

Gibt es eine andere (schnellere) Möglichkeit, den Körper aus einer Liste von Dreiecken oder Konturscheitelpunkten zu erstellen?

Wie machen sie das auf Box2D?

Aktualisieren:

Nach einigen Tests habe ich EdgeShapes für die Benutzerkontur verwendet (ohne Triangulation) und ich aktualisiere die Eckpunkte für diese Kanten in den Fixtures in jedem Frame, jetzt ist alles schneller.

((EdgeShape)(farseerBody.FixtureList[i].Shape)).Vertex1 = new Vector2(farseerVertices[i].X, farseerVertices[i].Y);

Aber die Kollisionen funktionieren nicht!

Mein Ansatz ist falsch?

EdgarT
quelle
Erstellen Sie das Ganze in jedem Frame? Könnte etwas langsam laufen, wenn Sie vielleicht große Mengen Müll produzieren? In diesem Fall versuchen Sie stattdessen, dieselben Objekte zu recyceln.
Mikael Högström
Sehen Sie das Video? Die Benutzerkontur wird in jedem Frame erstellt, sodass die Scheitelpunkte unterschiedlich sind. Gibt es einen Körpertyp, den ich recyceln kann? <br/> Dies ist ein weiteres Beispiel in Box2D youtube.com/watch?v=BPWKx3KAvTI
EdgarT
Bis ich weiß, basiert die Farseer-Physik auf box2d. Es muss einen Weg geben, dies zu tun. Ich habe das Gefühl, dass mir etwas Offensichtliches fehlt oder nicht?
EdgarT
Warum müssen Sie triangulieren, wenn Sie nur die Gesamtform verwenden?
user827992
Weil das Objekt konvex sein muss oder nicht? Ich habe einen Test mit dem Ear Clipping Algorithmus und einem Get bis zu 10fps gemacht, nicht viel besser ...
EdgarT

Antworten:

3

Endlich funktioniert!

Ich hatte die Eckpunkte der Kontur als Sequenz, daher bestand die Lösung darin, die LoopShape zu verwenden, um die Befestigung des Körpers zu erstellen. Ich wusste nicht einmal, dass Klasse = P.

 LoopShape loopShape = new LoopShape(farseerVertices);
 //Delete the previous fixture
 farseerBody.DestroyFixture(previousFixture);
 //Create new fixture with the new contour
 farseerBody.CreateFixture(loopShape);

Und das ist alles!

EdgarT
quelle