Ho un po 'più di problemi matematici con la programmazione 3D e spero che tu possa aiutarmi!Scenekit Pan Traduzione 2D in 3D ortogonale solo orizzontale
Sto provando a creare un gioco 3D utilizzando Scenekit con un angolo isometrico.
Questo codice crea la mia macchina fotografica ortografica:
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)
Ora voglio spostare la telecamera utilizzando un gesto padella, producendo una sensazione di scorrimento. Per rendere ciò possibile, la fotocamera non dovrebbe muoversi verticalmente, ma solo orizzontalmente. La posizione tattile sullo schermo e la posizione non proiettata nel mondo 3D dovrebbero rimanere gli stessi durante lo spostamento.
Ho pensato di calcolare la traduzione 2D in 3D e di ignorare la componente verticale. Questo codice funziona davvero e produce quasi il risultato desiderato, ma la velocità non è corretta. Se io Pan, la fotocamera sembra accelerare e non reagire in modo corretto:
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
}
Qualcuno sa un modo sofisticato di calcolo di una traduzione schermo in traduzione 3D orizzontale, ignorando l'asse verticale?
Grazie in anticipo :)
EDIT: La vaschetta lavora per traslazione orizzontale ora. Ma non per verticale, perché ho impostato la differenza sull'asse z su zero.
non si utilizza mai "diffTrans". Non vuoi usare "diffTrans" quando non proteggi (invece che "traduzione")? Altrimenti si accumulerebbero le traduzioni ad ogni iterazione. – Toyos
Grazie per aver segnalato questo! Ho provato così tanti approcci diversi che non ho visto quell'errore.Risolve il problema con il panning orizzontale ma non verticale, a causa della componente verticale indesiderata della traduzione mondiale –
Controlla la risposta del rickster della risposta qui: http://stackoverflow.com/questions/25150737/how-to-use- ios-swift-scenekit-scnscenerenderer-unprojectpoint-proper Alla fine ha una nota sulla gestione della non proiezione quando il piano della telecamera non è lo stesso di "mondo". Potrebbe essere un utile punto di partenza. –