2017-08-02 83 views
1

我有一个ARKit Spritekit项目,我想为每个ARAnchor显示不同的图像。如何将自定义参数传递给SKView委托方法视图(nodeFor)

我对添加到每个ARAnchor的SKSpriteNode图像的最佳匹配方式有点困惑,因为SKScene Scene类和视图控制器之间存在一些控制反转。

我在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) 

} 

我的问题是这样的:我应该如何传递动态图像信息?

  1. 我能继承ARAnchor并设置自定义锚类IMAGEURL当我Scene.swift锚添加到ARSKView
  2. 我应该插入不Scene.swift和替代视图控制器的ARAnchor - 然后以某种方式保持与ARAnchor和SKSpriteNode的链接?

回答

2

有很多可能的方式来做到这一点,所以这一切都归结为你更喜欢建筑你的应用程序/游戏。至于你问的可能性和其可行性,但:

  1. 是的,如果你创建你自己的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这里是无论你使用代码来从URL中加载SKTexture对象的占位符)

  2. 如果你把你的在视图控制器而不是SpriteKit场景中锚点管理代码,视图可以跟踪节点和锚点之间的对应关系:请参阅ARSKView上的node(for:)anchor(for:)方法。 (恕我直言,SKScene是作为一个“数据”类最好的思想,所以它不是一个子类添加逻辑的好地方。)

+0

所以即使我移动逻辑视图控制器 - 我仍然可能想要像#1那样子类ARAnchor? – MonkeyBonkey

+0

@MonkeyBonkey我不建议将属性添加到ARAnchor子类中,因为它会导致我冻结。 –

+0

我在ARAnchor子类中有一个属性。对于我来说,属性通过'view(_:nodeFor:)'是正确的,但随后丢失属性值。 – Caroline

相关问题