如何将 SKScene 添加到 SCNNode 平面?



我已经完成了raywenderlich.com教程,使用ARKit2 构建博物馆应用程序。我尝试修改此应用程序以在锚图像而不是AVPlayer上放置SKScene

我真正想做的只是在图像上放一个SKShapeNode,但是在进行研究之后,看起来我必须创建一个SKScene,将SKShapeNode添加到SKScene,然后将SKScene添加到SCNPlane中。

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

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

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

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

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

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

  • 核心动画图层 (CALayer)

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

  • A SpriteKit scene (SKScene)

  • 特殊格式的图像或包含六个图像的数组,指定立方体贴图的面

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

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)
}

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

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或如何使宽度成为非零值。

有人可以帮助我弄清楚我在这里做错了什么,或者这甚至是正确的方法吗?同样,我只想找到一个图像,并用SKShapeNode覆盖它。如果我必须用一个可以SKScene来做到这一点,我只需要帮助弄清楚如何做到这一点。如果这不是最好的方法,有人可以指出我可以找到仪表解决方案的文档吗?

谢谢!

这是因为这里let size = imageAnchor.referenceImage.physicalSizesize的宽度和高度为零。

您获得的大小将是你为参考图像设置的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)

最新更新