Набор сцен ARkit, встроенный в контроллер вида
Я пытаюсь встроить ARKit SceneKit View в контроллер представления в Xcode 9.2. Тем не менее, когда я делаю это, моя сцена отображается правильно, но я теряю вид из камеры с моей камеры. Это идет на черном фоне. Кто-нибудь знает, почему и как я могу это исправить?
Большое спасибо,
импорт UIKit импорт SceneKit импорт ARKit
Класс ViewControllerAR: UIViewController, ARSCNViewDelegate {
@IBOutlet var sceneViewAr: ARSCNView!
override func viewDidLoad() {
super.viewDidLoad()
// Set the view's delegate
sceneViewAr.delegate = self
// Show statistics such as fps and timing information
sceneViewAr.showsStatistics = true
// Create a new scene
let scene = SCNScene(named: "art.scnassets/sodium.scn")!
// Set the scene to the view
sceneViewAr.scene = scene
let mainnode = scene.rootNode.childNode(withName: "mainnode", recursively: true)
mainnode?.runAction(SCNAction.rotateBy(x: 10, y: 0, z: 0, duration: 0))
let orbit = scene.rootNode.childNode(withName: "orbit", recursively: true)
orbit?.runAction(SCNAction.rotateBy(x: 0, y: 2 * 50, z: 0, duration: 100))
if let orbittwo = scene.rootNode.childNode(withName: "orbit2", recursively: true) {
orbittwo.runAction(SCNAction.rotateBy(x: 0, y: -2 * 50, z: 0, duration: 100))
}
if let orbitthree = scene.rootNode.childNode(withName: "orbit3", recursively: true) {
orbitthree.runAction(SCNAction.rotateBy(x: 0, y: 2 * 50, z: 0, duration: 100))
}
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/
}
1 ответ
Решение
Проблема в том, что вы не настроили ARSession или ARWorldTrackingConfiguration.
Конечно, у меня нет ваших моделей и т. Д., Но это хорошо показывает "ARView".
Вот как должен выглядеть код:
class ViewController: UIViewController {
@IBOutlet weak var sceneViewAr: ARSCNView?
let configuration = ARWorldTrackingConfiguration()
let augmentedRealitySession = ARSession()
//--------------------
//MARK: View LifeCycle
//--------------------
override func viewDidLoad() {
super.viewDidLoad()
//1. Run The ARSession
augmentedRealitySession.run(configuration, options: [.resetTracking, .removeExistingAnchors])
sceneViewAr?.session = augmentedRealitySession
loadModels()
}
override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() }
func loadModels(){
// Create a new scene
let scene = SCNScene(named: "art.scnassets/sodium.scn")!
// Set the scene to the view
sceneViewAr?.scene = scene
let mainnode = scene.rootNode.childNode(withName: "mainnode", recursively: true)
mainnode?.runAction(SCNAction.rotateBy(x: 10, y: 0, z: 0, duration: 0))
let orbit = scene.rootNode.childNode(withName: "orbit", recursively: true)
orbit?.runAction(SCNAction.rotateBy(x: 0, y: 2 * 50, z: 0, duration: 100))
if let orbittwo = scene.rootNode.childNode(withName: "orbit2", recursively: true) {
orbittwo.runAction(SCNAction.rotateBy(x: 0, y: -2 * 50, z: 0, duration: 100))
}
if let orbitthree = scene.rootNode.childNode(withName: "orbit3", recursively: true) {
orbitthree.runAction(SCNAction.rotateBy(x: 0, y: 2 * 50, z: 0, duration: 100))
}
}
}
Надеюсь, поможет...