2014-08-28 11 views
6

Ich habe derzeit eine Ragdoll-Figur, die aus einem Elternknoten (ohne Physikkörper) besteht, und viele Kindknoten, die jeweils aus einem Kreiskörper bestehen. Die Kreise sind miteinander verbunden, um einen SKPhysicsJointPin zwischen jedem Kreis verwendet wird, wie folgt:Falsches Verhalten mit SKPhysicsJointPin, wenn shouldEnableLimits true ist und lowAngleLimit und upperAngleLimit gesetzt

Ragdoll figure

Jeder SKPhysicsJointPin hat shouldEnableLimits = true, und ich verwende momentan einen Wert von -0,05 und 0,05 für lowerAngleLimit und upperAngleLimit sind.

Das funktioniert ziemlich gut und verhindert, dass die Form von zu viel zu verformen, mit der Ausnahme, wenn die Figur geht upside-down als Ganze, wobei alle Gelenke plötzlich zu schrumpfen versuchen, etwa so:

Broken ragdoll figure

die Gelenke Vertrag sehr schnell zu, wenn die Zahl nach unten komplett auf dem Kopf ist. Wenn er sich wieder zurückdreht, normalisieren sich alle Gelenke wieder. Warum passiert das? Wie pflege ich die richtigen Winkel an den Gelenken?

Edit 1:

Ich habe gerade versucht, das Projekt in Objective-C, falls Umschreiben es wurde aufgrund eines seltsamen Swift Fehler; stellt sich heraus, dass sich dieses Problem immer noch in Objective-C manifestiert, also habe ich das Swift-Tag entfernt.

Meine beste Schätzung im Moment ist, dass der Winkel der Gelenke, relativ zur Welt, von SpriteKit falsch berechnet wird, wenn die Körper, an denen sie befestigt sind, mehr als 180 ° in beide Richtungen gedreht werden, und so falsche Winkel sind zu den zugrunde liegenden Box2D-Verbindungen übergeben werden.

Ich war mir nicht sicher, ob ich ständig die unteren und oberen Winkelgrenzen aktualisieren sollte, um den Weltwinkeln ihres Körpers zu entsprechen, aber es scheint nicht so zu sein, als wenn der Körper sehr nahe dran ist Auf den Kopf gestellt funktionieren die Gelenke nicht mehr richtig. Ich werde jedenfalls halten experimentieren ...

Edit 2:

Ich bin jetzt ziemlich sicher, dass das Problem tritt auf, weil SpriteKit ist (ich mit gutem Grund erraten) Modifizieren der zRotation Wert zu halten, zwischen -180 ° und 180 °. Wenn sich der Knoten zum Beispiel im Uhrzeigersinn dreht und auf -180 ° auftrifft, springt SpriteKit automatisch wieder auf + 180 ° zurück. Ich bin ziemlich zuversichtlich, dass dieser Umgriff der Gelenke richtig verhalten verursacht, ich muß nur herausfinden, wie es zu begegnen ...

bearbeiten 3:

Ich habe die Beispielanwendung hochgeladen (einschließlich Video), die dieses Problem veranschaulicht, wie sie ursprünglich für die von Apple gestellt: Xcode Project/Video

+0

Sie müssen längere PhysikBodies anstelle von Kreisen verwenden. Jeder Physikkörper sollte entweder einen Arm, Bein, Fuß, Torso, etc. darstellen. Ist Ihr eigener Körper aus einer Knochenstruktur, die Sie habe ich hier erstellt? – ZeMoon

+0

Ich weiß, es ist keine genaue Darstellung des menschlichen Körpers, in diesem Fall ist es nicht zu sein! Ich bin meist nur mit dem seltsamen Verhalten der Gelenke im Moment betroffen. – Robert

+0

haben Sie versucht, die Schwerkraft zu deaktivieren für die einzelnen Körper? – LearnCocos2D

Antwort

0

„ich verwende derzeit einen Wert von -0,05 und 0,05 für lowerAngleLimit und upperAngleLimit bzw.“

Laut der Dokumentation ...

upperAngleLimit - The largest angle allowed for the pin joint, in radians.

... sind die Grenzen in Radiant.

0.05 radians = 2.86478898 degrees 

Sie erlauben also nur den Körpern, sich ungefähr 5 Grad zu bewegen. Dies ist ein extrem kleiner Bereich. Aus meiner Erfahrung heraus startet SpriteKit dieses merkwürdige Schnappverhalten, wenn der Körper außer Reichweite gerät.

Ich glaube nicht, dass dieses Verhalten spezifisch für umgedrehte Körper ist. Meine beste Vermutung ist, dass die Physik-Engine nicht die Framerate hat, um die Schwerkraft in einem Frame anzuwenden und den Körper zu fangen, bevor er in der nächsten außerhalb der Reichweite bewegt wird.

Sie sollten die Reichweite erhöhen. Ich bevorzuge es in Grad anzugeben. Zum Beispiel ...

func degreesToRadians(degrees: CGFloat) -> CGFloat { 
    return CGFloat(M_PI) * degrees/180.0 
} 

pinJoint.shouldEnableLimits = true 
pinJoint.lowerAngleLimit = degreesToRadians(-30.0) 
pinJoint.upperAngleLimit = degreesToRadians(180.0) 

Sie müssen mit der Winkel, Masse und Schwerkraft basteln, bis Sie einen Sweet-Spot zu finden, wo die Dinge realistisch zu bewegen.

Wenn Sie wirklich eine kleine Bewegungsreichweite haben wollen, würde ich es in Betracht ziehen, sie komplett zu deaktivieren.

circle.physicsBody?.allowsRotation = false 
+0

Danke für deine Antwort, aber ich habe viele verschiedene Blickwinkel ausprobiert; Ein kleiner Winkel ist nicht die Ursache.Ich bin mir ziemlich sicher, dass das Problem durch SpriteKits Normalisierung der Körperdrehwinkel verursacht wird, wenn sie sich über ihr Limit bewegen und die darunterliegenden Box2D-Gelenke verwirren. Auf jeden Fall glaube ich nicht, dass ein ~ 5º für eine Physik-Engine zu klein ist, und es macht einen perfekten Job mit ihnen, bis der Charakter auf den Kopf gestellt wird! – Robert

+0

Nun, alles was ich dir sagen kann ist, dass ich eine Ragdoll in SpriteKit implementiert habe und ich habe keine Probleme, wenn es auf den Kopf geht. Was Sie versuchen, ist 100% möglich. –

+0

Als ich den Fehlerbericht einreichte, bat Apple um eine Beispielanwendung/ein Video - ich habe es gerade für den modernen Swift repariert und neu hochgeladen (funktioniert immer noch nicht auf die gleiche Weise). Ich würde mich für jede Einsicht interessieren, die du hattest! – Robert

0

Ich kann bestätigen, dass dies ein Fehler in SpriteKit ist. In meinem Fall verwende ich das einfachste Szenario von zwei Sprites, die durch einen Stift verbunden sind. Leider passiert es immer noch auf iOS 9 :(

+0

Auch das ist der Grund, warum ich Chipmunk in meinem Projekt verwenden musste. – JakubKnejzlik