Как разместить 3D-модель с помощью ARKit iOS 11 с некоторым пользовательским фоном без использования камеры?

Я работаю над приложением для iOS с дополненной реальностью, для которого я использую ARKIT из бета-версии iOS 11. Я использую ARSCNView (SceneKit) для рендеринга моего объекта .scn. Я последовал примеру Apple, чтобы создать сеанс ARSession (https://developer.apple.com/sample-code/wwdc/2017/PlacingObjects.zip). Можно ли вместо камеры разместить 3D-модель с кастомным фоном?

Как пользователь может выбрать цвет фона или может предоставить пользовательские 2D-фотографии в качестве фона?


person yaali    schedule 26.07.2017    source источник
comment
Вам нужно включить дополнительную информацию. Что ты делаешь? Вы используете SceneKit, что вы имеете в виду под камерой?   -  person jlsiewert    schedule 26.07.2017
comment
@orangenkopf Извините за расплывчатый вопрос. Я отредактировал свой вопрос. Я использую SceneKit и образец PlacingObjects, предоставленный Apple.   -  person yaali    schedule 26.07.2017
comment
Значит, вы не хотите использовать поток камеры в качестве фона сцены, а хотите что-то другое? Но чем у вас больше нет AR? Вы можете изменить фон scene на изображение или цвет: scene.background.contents = UIColor.red. Я не знаю, работает ли это и для ARKit.   -  person jlsiewert    schedule 26.07.2017
comment
@orangenkopf Это именно то, что мне было нужно !! Я хочу дать пользователю возможность разместить объект либо с помощью камеры (AR), либо с настраиваемым фоном. Вот почему мне это нужно. Спасибо!!   -  person yaali    schedule 26.07.2017
comment
Вы пробовали, и он работает? Или ARKit каким-то образом переопределяет фон сцены?   -  person jlsiewert    schedule 26.07.2017
comment
Я попробовал, и все работает. Все функции ARKit остаются прежними, за исключением того, что фон камеры заменяется настраиваемым видом.   -  person yaali    schedule 26.07.2017
comment
Как ты поменял содержимое камеры обратно?   -  person ooOlly    schedule 14.09.2017
comment
@ ooOlly Не знаю, правильный ли это подход, но я сохранил содержимое камеры и, когда я вернусь к исходному виду, я снова установил источник камеры на сохраненное содержимое, чтобы вернуть вид камеры.   -  person yaali    schedule 19.09.2017
comment
Спасибо за внимание, сэкономив мое время!   -  person ooOlly    schedule 20.09.2017


Ответы (2)


В вашем представлении есть свойство scene, где вы можете установить background на цвет или изображение:

 view.scene.background.contents = UIColor.red

 let myImage: UIImage = ... 
 view.scene.background.contents = myImage
person jlsiewert    schedule 26.07.2017
comment
У вас есть идеи, как вернуть это обратно к виду с камеры? Я просто хочу удалить фоновое изображение и вернуть камеру. - person yaali; 26.07.2017
comment
Попробуйте установить для содержимого nil - person jlsiewert; 26.07.2017
comment
Не повезло :( Просто меняет фон на белый. Камеру больше не видно. - person yaali; 26.07.2017
comment
@yaali, ты когда-нибудь придумал способ вернуть камеру в поле зрения? Столкновение с той же проблемой - person rudd; 21.01.2018
comment
Я сохранил содержимое камеры, и когда я вернусь к исходному виду, я снова установил источник камеры на сохраненное содержимое, чтобы вернуть вид камеры. - person yaali; 22.01.2018

Я использую обратный вызов UIKit при встряхивании, чтобы изменить фоновое содержимое. Как сказал @yaali, CameraContents используется для хранения содержимого камеры. Обратите внимание, что мы не можем получить background.contents, если камера не запущена, например, на viewWillAppear. Думаю, ARKit установил AVCaptureVideoPreviewLayer на ARSCNView.scene.background.cocntents.

    override func motionBegan(_ motion: UIEventSubtype, with event: UIEvent?) {
        if CameraContents == nil {
            CameraContents = sceneView.scene.background.contents;
            return
        }
        if cameraBackGround == true {
            sceneView.scene.background.contents = "Background_sky.png"
        }else{
            sceneView.scene.background.contents = CameraContents
        }
        cameraBackGround = !cameraBackGround

    }
person ooOlly    schedule 20.09.2017