如何将SKScene添加到SCNNode平面?

时间:2019-04-16 04:50:36

标签: ios swift sprite-kit scenekit arkit

我已完成raywenderlich.com教程,使用ARKit 2构建博物馆应用。我试图修改此应用,以将SKScene放置在锚图像上,而不是{{1 }}。

我真正想做的就是在图像上放置一个AVPlayer,但是经过研究后,看起来我必须创建一个SKShapeNode,将SKScene添加到{{ 1}},然后将SKShapeNode添加到SKScene

  

您可以使用以下任意一种类型为此属性设置值:

     
      
  • 一种颜色(NSColor / UIColor或CGColor),为材质的表面指定统一的颜色

  •   
  • 一个数字(NSNumber),用于指定材料表面的统一标量值(用于基于物理的特性(例如金属性)

  •   
  • 图像(NSImage / UIImage或CGImage),指定要在材质表面上映射的纹理

  •   
  • 指定图像文件位置的NSString或NSURL对象

  •   
  • 视频播放器(AVPlayer)或实时视频捕获预览(AVCaptureDevice,仅在iOS中)

  •   
  • 核心动画层(CALayer)

  •   
  • 纹理(SKTexture,MDLTexture,MTLTexture或GLKTextureInfo)

  •   
  • SpriteKit场景(SKScene)

  •   
  • 一种特殊格式的图像或六个图像的数组,用于指定立方体贴图的面

  •   

这是我对代码的修改后的版本:

SKScene

当我在iPhone上运行它并将其指向图像时,应用程序崩溃,并且得到以下堆栈跟踪。

SCNPlane

我不确定private func handleFoundImage(_ imageAnchor: ARImageAnchor, _ node: SCNNode) { let name = imageAnchor.referenceImage.name! print("you found a \(name) image") let size = imageAnchor.referenceImage.physicalSize let skScene = SKScene(size: size) print("SKSCENE FRAME: \(skScene.frame)") skScene.backgroundColor = .white let skShape = SKShapeNode(rectOf: size, cornerRadius: 5.0) skShape.fillColor = .blue skShape.strokeColor = .red skShape.lineWidth = 1.5 skScene.addChild(skShape) let plane = SCNPlane(width: size.width, height: size.height) let material = SCNMaterial() material.lightingModel = SCNMaterial.LightingModel.constant material.isDoubleSided = true material.diffuse.contents = skScene plane.materials = [material] let rectNode = SCNNode(geometry: plane) rectNode.eulerAngles.x = -.pi / 2 node.addChildNode(rectNode) } 是什么,也不知道如何将宽度设置为非零值。

有人可以帮我弄清楚我在这里做错了什么,还是这样做的正确方法?再次,我只想查找图像,并用2019-04-15 22:32:28.650432-0600 ImageTracker[3807:1577260] [DYMTLInitPlatform] platform initialization successful 2019-04-15 22:32:29.238671-0600 ImageTracker[3807:1577061] [Accessibility] ****************** Loading GAX Client Bundle **************** 2019-04-15 22:32:29.362407-0600 ImageTracker[3807:1577061] Metal GPU Frame Capture Enabled 2019-04-15 22:32:29.364368-0600 ImageTracker[3807:1577061] Metal API Validation Enabled 2019-04-15 22:32:29.499256-0600 ImageTracker[3807:1577061] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles 2019-04-15 22:32:29.500912-0600 ImageTracker[3807:1577061] [MC] Reading from public effective user settings. Point the camera at a dinsoaur. you found a stegosaurus image SKSCENE FRAME: (-0.0, -0.0, 0.10541000217199326, 0.06538714197231457) <SKScene> name:'(null)' frame:{{-0, -0}, {0.10541000217199326, 0.065387141972314572}} anchor:{0, 0} 2019-04-15 22:32:37.189388-0600 ImageTracker[3807:1577292] validateTextureDimensions, line 1071: error 'MTLTextureDescriptor has width of zero.' validateTextureDimensions:1071: failed assertion `MTLTextureDescriptor has width of zero.' 覆盖它。如果必须使用MTLTextureDescriptor来完成此操作,那么我只需要帮助弄清楚如何执行此操作即可。如果那不是最好的方法,有人可以将我指向可以找到仪表解决方案的文档吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

这是因为sizelet size = imageAnchor.referenceImage.physicalSize中的宽度和高度为零。

您获得的尺寸将是您为参考图像设置的physicalSize,该尺寸肯定小于1米。因此,当您将其用作skScene的大小时,创建的高度和宽度都等于零。

例如:如果您的参考图像的物理尺寸为10x15厘米,则您的size的宽度为0.1,高度为0.15。,它们将更改为零。

我建议:

let physicalSize = imageAnchor.referenceImage.physicalSize
let size = CGSize(width: physicalSize.width * 1000, height: physicalSize.height * 1000)