Поскольку любые эмодзи являются 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
, содержащее смайлики на выбор, прочитайте следующий пост .