Jestem w trakcie uczenia się jednocześnie ARKit i Scenekit, i to było trochę wyzwaniem.ARKit - Zdobądź aktualną pozycję "kamery" na scenie
Po utworzeniu sesji ARWorldTrackingSessionConfiguration zastanawiałem się, czy ktokolwiek wiedział, jak uzyskać pozycję "aparatu" użytkownika w sesji sceny. Chodzi o to, że chcę animować obiekt w kierunku aktualnej pozycji użytkownika.
let reaperScene = SCNScene(named: "reaper.dae")!
let reaperNode = reaperScene.rootNode.childNode(withName: "reaper", recursively: true)!
reaperNode.position = SCNVector3Make(0, 0, -1)
let scene = SCNScene()
scene.rootNode.addChildNode(reaperNode)
// some unknown amount of time later
let currentCameraPosition = sceneView.pointOfView?.position
let moveAction = SCNAction.move(to: currentCameraPosition!, duration: 1.0)
reaperNode.runAction(moveAction)
Jednak wydaje się, że currentCameraPosition jest zawsze [0,0,0], mimo że poruszam kamerą. Masz pojęcie, co robię źle? W końcu chciałbym obrócić obiekt wokół niewidzialnej kuli, aż znajdzie się przed kamerą, a następnie ją ożywić, robiąc coś podobnego do tego: Rotate SCNCamera node looking at an object around an imaginary sphere (w ten sposób użytkownik widzi, że obiekt ożywia się w jego kierunku)
Dzięki za pomoc.
To działa, ale można również uzyskać ramek nie będąc delegatem sesja dostając 'currentFrame' sesji za własność. – rickster
@Rickster jesteś napięty i edytowałem odpowiedź, ale zazwyczaj chcesz, aby inne węzły reagowały na ciebie zmieniając twoją pozycję, np. Podążając za tobą. W takim razie chcesz ciągłe aktualizacje nowych ujęć kamery. – orangenkopf
Prawda. Punktem jest, w zależności od tego, jak twoja aplikacja jest inaczej skonfigurowana, możesz mieć ARKita dostarczającego ci klatki z szybkością 60 klatek na sekundę i renderowania, gdy je otrzymasz, lub możesz uruchomić własną pętlę renderowania przy (do) 60 fps i zapytać ARKit dla ramki za każdym razem, gdy jej potrzebujesz. Obsługuje oba sposoby, więc używaj tego, co chcesz. – rickster