我如何从集合视图中选择项目并将其添加到SCNScene? [英] How can I pick item from collectionView and add it to SCNScene?

查看:29
本文介绍了我如何从集合视图中选择项目并将其添加到SCNScene?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我如何才能做到这一点?我想我必须为Node创建一个函数,但我的想法仍然在脑海中模糊,我不是很清楚。

推荐答案

只要表情符号是2D元素,最好使用SpriteKit框架来上传,而不是SceneKit。当然,您也可以选择SceneKit。因此,您可以通过两种方式在ARKit中使用emoji:

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

  • 使用SceneKit。在ARSCNView中,您可以将所有精灵用作3D几何体的纹理。此纹理可以是平面、立方体、球体或任何自定义模型,这取决于您。例如,要使平面(上面有emoji纹理)面对相机,请使用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

这篇关于我如何从集合视图中选择项目并将其添加到SCNScene?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆