首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从collectionView中选择项目并将其添加到SCNScene?

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

Stack Overflow用户
提问于 2019-06-09 06:39:37
回答 1查看 259关注 0票数 0

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

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

EN

回答 1

Stack Overflow用户

发布于 2019-06-09 15:59:47

只要任何表情符号是2D元素,最好使用SpriteKit框架而不是SceneKit来上传它们。但是,当然,您也可以选择SceneKit。因此,有两种方法可以在ARKit中使用表情符号:

  • Using SpriteKit.在这种情况下,您在ARSKView中繁殖的所有2D精灵始终面对摄影机。因此,如果摄影机围绕真实场景的某个确定点移动,则所有精灵都会围绕其面向camera.
  • Using SceneKit的轴心点旋转。在ARSCNView中,您可以将所有精灵用作3D几何体的纹理。此纹理可以用于平面、立方体、球体或任何自定义模型,这取决于您。例如,要使平面(上面有表情符号纹理)面对相机,请使用SCNBillboardConstraint约束。

下面是您在ViewController中编写代码的方式:

代码语言:javascript
复制
// 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文件中的...and:

代码语言:javascript
复制
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)
    }
}

或者,如果您使用命中测试,您的代码可能如下所示:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56510632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档