2014-10-02 9 views
5

Ich verwende SceneKit und habe eine App mit mehreren SCNNodes. Wenn der Benutzer auf einen Finger tippt, folgt er dem Finger (mit einem UILongPressGestureRecognizer). In dem Staat begann und geändert, verwende ich die folgende Codezeile, um die Position des Knotens zu ändern:Ändern der SCNNode-Position, ohne die Ausrichtung zu ändern

_currentlyMoving?.position = SCNVector3Make(worldPoint.x, worldPoint.y, worldPoint.z) 

In dieser Zeile _currentlyMoving die SCNNode ist, und World die Position meines Fingers.

Dies bewegt den Knoten in die richtige Position; Es scheint jedoch auch die Rotation des Knotens in (0,0,0) zu ändern (der Knoten befindet sich immer in seiner Startrotation).

Gibt es eine Möglichkeit, die Position eines SCNNode zu ändern, ohne die Drehung?

Auch habe ich folgendes versucht, aber es hat nicht funktioniert entweder (das gleiche passierte):

_currentlyMoving?.transform.m41 = worldPoint.x 
_currentlyMoving?.transform.m42 = worldPoint.y 
_currentlyMoving?.transform.m43 = worldPoint.z 

Die einzige andere Sache, die ich mit dem Knoten tue, sind die folgenden drei Zeilen zu stoppen up Bewegung nahm während:

_currentlyMoving?.physicsBody?.velocity = SCNVector3Make(0.0, 0.0, 0.0) 
_currentlyMoving?.physicsBody?.velocityFactor = SCNVector3Make(0.0, 0.0, 0.0) 
_currentlyMoving?.physicsBody?.angularVelocity = SCNVector4Make(0.0, 0.0, 0.0, 1.0) 
+0

Hat Ihr Knoten ein physicBody-Set? Wenn Sie es programmatisch bewegen, haben Sie einen "kinematischen" Körper verwendet? – Toyos

+0

@Toyos Es hat einen Physikkörper, aber es ist dynamisch, nicht kinematisch. – Jsdodgers

+0

Die Transformation des Knotens sollte nicht von seiner Position beeinflusst werden, es sei denn, Sie haben bestimmte Einschränkungen. Können Sie den minimalen Code teilen, um dieses Problem zu reproduzieren? – Gusutafu

Antwort

5

So, nachdem viele Dinge für ein paar Tage zu testen, ich, dass die Rotation nie auf dem Knoten immer gesetzt tatsächlich herausgefunden; Es wird nur auf dem Präsentationsknoten gesetzt. Aus diesem Grund wurde die Transformation des Knotens automatisch immer dann neu berechnet, wenn ich die Position einstellte, basierend auf meiner neuen Position und der aktuellen Rotation (die ich für [0,0,0] hielt), wodurch die Rotation des Knotens effektiv zurückgesetzt wurde.

Um dieses Problem zu lösen, müssen Sie also die Rotation des Knotens in die Rotation des presentationNodes ändern.

Dies ist, was ich zur Zeit .Began Staat tue meinem in panGestureRecognizer (nach dem berührten Knoten zu currentlyMoving Einstellung:

if let currentlyMoving = _currentlyMoving { 
    if let presentationNode = currentlyMoving.presentationNode() { 
     currentlyMoving.rotation = presentationNode.rotation 
    } 
    currentlyMoving.position = newLocation 
} 

es, bevor Damit wird nur die Rotation der Knoten seine Präsentation Rotation, so dass die Transformation Korrekt basierend auf dem, was der Benutzer sehen kann

Ein Problem, das ich damit hatte, war, dass einige der Modelle, die ich heruntergeladen habe, noch seltsam von winzigen Mengen gedreht wurden, obwohl alle von mir selbst erstellten Modelle funktionierten gut, ich musste mein eigenes erstellen Versionen der anderen Modelle, nach denen alles gut funktioniert hat. Ich weiß also immer noch nicht genau, was mit den ersten Modellen falsch war, die sie dazu brachten, sich etwas zu verschieben, wenn ich ihre Drehungen auf ihre Präsentationsdrehungen einstellte (ich habe keine Erfahrung mit 3D-Modellierung).