如何从collectionView中选择项目并将其添加到SCNScene?

时间:2019-06-08 22:39:37

标签: ios swift xcode augmented-reality arkit

我正在使用SceneKit和ARKit。我用一系列表情符号制作了collectionView。现在,我希望用户能够从collectionView中选择表情符号,并且当他/她触摸屏幕时,所选表情符号将以3D形式放置。

我该怎么做?我想我必须为Node创建一个函数,但是我的想法仍然很模糊,我不太清楚。

1 个答案:

答案 0 :(得分:0)

至于任何表情符号都是2D元素,最好使用SpriteKit框架上传它们,而不是SceneKit。但是,当然,您也可以选择一个SceneKit。因此,可以通过两种方式在ARKit中使用表情符号:

  • 使用SpriteKit 。在这种情况下,您在ARSKView中生成的所有2D子图始终都面向相机。因此,如果摄影机绕着真实场景的确定点移动,则所有子画面都围绕着面向摄影机的枢轴点旋转。

  • 使用SceneKit 。在ARSCNView中,您可以将所有精灵用作3D几何的纹理。该纹理可以是平面,立方体,球体或任何自定义模型的,这取决于您。例如,要制作一个上面带有表情符号纹理的平面面向相机,请使用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覆盖,请阅读the following post

如果您想创建一个SKView叠加层,其中包含可供选择的表情符号,请阅读the following post