我正在和SceneKit和ARKit一起工作。我已经制作了一个带有一系列表情符号的collectionView
。现在我希望用户能够从collectionView
中选择表情符号,当他/她触摸屏幕时,选择的表情符号将以3D形式放置。
我该怎么做呢?我想我必须为Node创建一个函数,但我的想法在脑海中仍然是模糊的,我不是很清楚。
发布于 2019-06-09 15:59:47
只要任何表情符号是2D元素,最好使用SpriteKit框架而不是SceneKit来上传它们。但是,当然,您也可以选择SceneKit。因此,有两种方法可以在ARKit中使用表情符号:
下面是您在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
文件中的...and:
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。
https://stackoverflow.com/questions/56510632
复制相似问题