Как переключить загрузку объекта в Swift Scenekit? - PullRequest
1 голос
/ 13 апреля 2020

Я хочу загрузить объекты, используя iOS SceneKit.

А как выгрузить загруженный объект и перезагрузить другой объект?

Мне удалось загрузить объект, ссылаясь на код ниже .

func sceneSetup() {

    if let filePath = Bundle.main.path(forResource: "Smiley", ofType: "scn") {
        let referenceURL = URL(fileURLWithPath: filePath)

        self.contentNode = SCNReferenceNode(url: referenceURL)
        self.contentNode?.load()
        self.head.morpher?.unifiesNormals = true // ensures the normals are not morphed but are recomputed after morphing the vertex instead. Otherwise the node has a low poly look.
        self.scene.rootNode.addChildNode(self.contentNode!)
    }
    self.faceView.autoenablesDefaultLighting = true

    // set the scene to the view
    self.faceView.scene = self.scene

    // allows the user to manipulate the camera
    self.faceView.allowsCameraControl = false

    // configure the view
    self.faceView.backgroundColor = .clear
}

Но я не знаю, как загрузить и переключить несколько объектов.

Я добавил testScene.scn в проект и добавил код как ниже, но был загружен только первый указанный объект.

var charaSelect = "Smiley"

//tapEvent(ViewDidLoad)
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(FaceGeoViewController.tapped(_:)))
    tapGesture.delegate = self
    self.view.addGestureRecognizer(tapGesture)

//tap
 @objc func tapped(_ sender: UITapGestureRecognizer)
 {
    self.charaSelect = "testScene"
 }

func sceneSetup() {

    if let filePath = Bundle.main.path(forResource: self.charaSelect, ofType: "scn") {
        let referenceURL = URL(fileURLWithPath: filePath)

        self.contentNode = SCNReferenceNode(url: referenceURL)
        self.contentNode?.load()
        self.head.morpher?.unifiesNormals = true // ensures the normals are not morphed but are recomputed after morphing the vertex instead. Otherwise the node has a low poly look.
        self.scene.rootNode.addChildNode(self.contentNode!)
    }
    self.faceView.autoenablesDefaultLighting = true

    // set the scene to the view
    self.faceView.scene = self.scene

    // allows the user to manipulate the camera
    self.faceView.allowsCameraControl = false

    // configure the view
    self.faceView.backgroundColor = .clear
}

Что мне делать?

1 Ответ

1 голос
/ 13 апреля 2020

Я объясню концепцию здесь, но если вам, возможно, понадобится рассматривать эти вещи как завершенный проект, вы можете обратиться к коду , который я последовал из книги «Разработка приложений с помощью Swift » от Apple Education, 2019, в частности, Руководствуемый проект в конце главы 3А.

Ниже вы можете увидеть пример скриншота. В приложении вы можете добавлять элементы, касаясь пустого места в SceneView или когда ваше касание сталкивается с другим объектом (плоскостью). Кроме того, существует логика c для удаления объекта

enter image description here

Таким образом, в принципе, один из способов удаления узлов из сцены - это отслеживать их в ViewController с помощью специального массива var placedNodes = [SCNNode](). Таким образом, вы можете очистить вид со всех узлов (например, создав действие кнопки «Очистить»)

Еще одно приятное дополнение, которое вы можете получить asp от разработчиков Apple, использует не распознаватель жестов касания, а переопределив touchesBegan / touchesMoved , это может дать вам больше гибкости с точки зрения того, что вы можете делать с помощью сенсорных жестов, в частности, вы можете получить его местоположение в SceneView, вызвав touch.location(in: sceneView) .

Итак, touchesBegan/touchesMoved позволяет вам найти места, которые были прослушаны пользователем. Это может быть использовано для добавления / удаления объектов в SceneView

Надеюсь, что это поможет!

...