Ich habe ein wenig mehr mathematisches Problem mit 3D-Programmierung und ich hoffe, Sie können mir helfen!Scenekit Pan 2D Übersetzung zu Orthographic 3D nur horizontal
Ich versuche ein 3D-Spiel mit Scenekit mit einem isometrischen Winkel zu erstellen.
Dieser Code erstellt meine orthogonale Kamera:
var cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.name = "Camera"
cameraNode.position = SCNVector3Make(-5.0, -5.0, 10.0)
cameraNode.eulerAngles = SCNVector3Make(PI/3.0, 0.0, -PI/4.0)
cameraNode.camera?.usesOrthographicProjection = true
cameraNode.camera?.orthographicScale = 7.0
scene.rootNode.addChildNode(cameraNode)
Jetzt habe ich die Kamera mit einer Pfanne Geste bewegen will, ein Scroll-Gefühl zu erzeugen. Um dies zu ermöglichen, sollte sich die Kamera nicht vertikal, sondern nur horizontal bewegen. Der Touch-Standort auf dem Bildschirm und die nicht projizierte Position in der 3D-Welt sollten während der Bewegung gleich bleiben.
Ich dachte über die Berechnung der 2D-Übersetzung in 3D-Differenz und die vertikale Komponente zu ignorieren. Dieser Code funktioniert tatsächlich und erzeugt fast das gewünschte Ergebnis, aber die Geschwindigkeit ist nicht korrekt. Wenn ich schwenken, scheint die Kamera zu beschleunigen und nicht richtig reagieren:
var previousTranslation = CGPointMake(0.0, 0.0)
func pan(gesture: UIPanGestureRecognizer)
{
let view = self.view as SCNView
let translation = gesture.translationInView(view)
let location = gesture.locationInView(view)
let diffTrans = translation - previousTranslation
previousTranslation = translation
let cameraNode = scene.rootNode.childNodeWithName("Camera", recursively: false)
let worldPointTrans = view.unprojectPoint(SCNVector3Make(-Float(diffTrans.x), -Float(diffTrans.y), 0.0))
let worldPoint0 = view.unprojectPoint(SCNVector3Make(0.0, 0.0, 0.0))
var diff = worldPointTrans - worldPoint0
diff.x = diff.x/Float(cameraNode!.camera!.orthographicScale)
diff.y = diff.y/Float(cameraNode!.camera!.orthographicScale)
diff.z = 0
cameraNode?.position += diff
}
Kennt jemand eine anspruchsvolle Art und Weise einen Bildschirm Übersetzung in eine horizontale 3D-Übersetzung der Berechnung, um die vertikale Achse zu ignorieren?
Vielen Dank im Voraus :)
EDIT: Die Pfanne jetzt horizontal Übersetzung funktioniert. Aber nicht für vertikal, weil ich die Differenz auf der z-Achse auf Null setze.
verwenden Sie nie "diffTrans". Möchten Sie "diffTrans" nicht verwenden, wenn Sie den Schutz aufheben (statt "Übersetzung")? Andernfalls würden Sie die Übersetzungen bei jeder Iteration akkumulieren. – Toyos
Vielen Dank für das Aufzeigen! Ich habe so viele verschiedene Ansätze ausprobiert, dass ich diesen Fehler nicht gesehen habe.Es löst das Problem mit dem horizontalen Schwenken, aber nicht mit vertikal, wegen der unerwünschten vertikalen Komponente der Welt-Übersetzung –
Überprüfen Sie die Antwort Rickster-Antwort hier: http://StackOverflow.com/Questions/25150737/How-To-use- ios-swift-scenekit-scnscenrenderer-unprojectpoint-richtig Er hat am Ende eine Notiz über die Handhabung der Unprojektion, wenn die Kameraebene nicht gleich "Welt" ist. Es könnte ein nützlicher Ausgangspunkt sein. –