我有一个ARKit Spritekit项目,我希望为每个ARAnchor显示不同的图像。
我对匹配SKSpriteNode图像的最佳方法感到困惑我添加到每个ARAnchor,因为SKScene
Scene类和视图控制器之间存在一些控制反转。 / p>
我在Scene.swift中添加了锚点,在视图控制器中,我处理了委托方法。
func view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode? {
// Create and configure a node for the anchor added to the view's session.
// this image url needs to be dynamic and vary for each node
let imageURL = "https://farm1.staticflickr.com/[SOMEID].jpg"
let url = URL(string: imageURL)
let data = try? Data(contentsOf: url!)
let theImage = UIImage(data: data!)
let Texture = SKTexture(image: theImage!)
return SKSpriteNode(texture: Texture)
}
我的问题是:我应该如何传递动态图像信息?
ARAnchor
ARSKView
并在自定义锚类中设置imageUrl
ARAnchor
而是从视图控制器插入 - 然后以某种方式保留到ARAnchor
和SKSpriteNode的链接? 答案 0 :(得分:2)
有很多可能的方法可以做到这一点,所以这一切都取决于你喜欢如何构建你的应用程序/游戏。关于你询问的可能性及其可行性,但是:
是的,如果您要创建自己的ARAnchor
个对象并将其添加到ARSession
,则可以定义ARAnchor
个子类(包括类似于图像URL)并传递它们。当您的自定义类出现在另一端时,它将保留其标识和内容。您只需要在委托方法中检查它:
func view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode? {
if let anchor = anchor as? MyAnchor {
let texture = self.textureForURL(anchor.imageURL)
return SKSpriteNode(texture: texture)
}
}
(注意textureForURL
这里是一个占位符,用于从网址加载SKTexture
个对象的任何代码。)
如果您将锚管理代码放在视图控制器而不是SpriteKit场景中,则视图可以跟踪节点和锚点之间的对应关系:请参阅node(for:)
和anchor(for:)
ARSKView
上的方法。 (恕我直言,SKScene
最好被认为是"数据"类,所以它不是用于子类化添加逻辑的好地方。)