Как я могу выбрать элемент из collectionView и добавить его в SCNScene? - PullRequest
0 голосов
/ 09 июня 2019

Я работаю со SceneKit и ARKit. Я сделал collectionView с набором смайликов. Теперь я хочу, чтобы пользователь мог выбрать смайлик из collectionView, и когда он / она коснется экрана, выбранный смайлик будет помещен в 3D.

Как я могу это сделать? Я думаю, что я должен создать функцию для узла, но моя мысль все еще размыта в уме, и я не очень ясен.

1 Ответ

0 голосов
/ 09 июня 2019

Поскольку любые эмодзи являются 2D-элементами, для их загрузки лучше использовать инфраструктуру SpriteKit, а не SceneKit. Но, конечно, вы также можете выбрать SceneKit. Итак, в ARKit есть два способа работы с смайликами:

  • Использование SpriteKit . В этом случае все спрайты 2D, которые вы порождаете в ARSKView, всегда направлены на камеру. Таким образом, если камера перемещается вокруг определенной точки реальной сцены, все спрайты вращаются вокруг своей точки вращения, обращенной к камере.

  • Использование SceneKit . В ARSCNView вы можете использовать все свои спрайты в качестве текстуры для трехмерной геометрии. Эта текстура может быть для плоскости, куба, сферы или любой другой модели, это ваше дело. Например, чтобы сделать плоскость (с текстурой смайликов на ней) лицом к камере, используйте ограничение SCNBillboardConstraint .

Вот как может выглядеть код в ViewController:

// Element's index coming from `collectionView`
var i: Int = 0

func view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode? {
    let emojiArray = ["?","?","?","?","?"]
    let emojiNode = SKLabelNode(text: emojiArray[i])           
    emojiNode.horizontalAlignmentMode = .center
    emojiNode.verticalAlignmentMode = .center
    return emojiNode
}

... и в Scene.swift файле:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let sceneView = self.view as? ARSKView else { return }

    if let currentFrame = sceneView.session.currentFrame {
        var translation = matrix_identity_float4x4
        translation.columns.3.z = -0.75               // 75 cm from camera
        let transform = simd_mul(currentFrame.camera.transform, translation)
        let anchor = ARAnchor(transform: transform)
        sceneView.session.add(anchor: anchor)
    }
}

Или, если вы используете хит-тестирование, ваш код может выглядеть следующим образом:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let sceneView = self.view as? ARSKView else { return }

    if let touchLocation = touches.first?.location(in: sceneView) {
        if let hit = sceneView.hitTest(touchLocation, types: .featurePoint).first {
            sceneView.session.add(anchor: ARAnchor(transform: hit.worldTransform))
        }
    }
}

Если вы хотите создать UICollectionView оверлей, содержащий смайлики на выбор, прочитайте следующий пост .

Если вы хотите создать наложение SKView, содержащее смайлики на выбор, прочитайте следующий пост .

...