如何将SKScene添加到SCNNode平面?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将SKScene添加到SCNNode平面?相关的知识,希望对你有一定的参考价值。

我已经完成了raywenderlich.com教程用ARKit构建博物馆应用程序2.我试图修改这个应用程序将SKScene放在锚图像而不是AVPlayer

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

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

  • 一种颜色(NSColor / UIColor或CGColor),指定材质表面的均匀颜色
  • 一个数字(NSNumber),指定材质表面的均匀标量值(对于基于物理的属性,如金属度有用)
  • 图像(NSImage / UIImage或CGImage),指定要在材质表面上映射的纹理
  • NSString或NSURL对象,指定图像文件的位置
  • 视频播放器(AVPlayer)或实时视频捕获预览(AVCaptureDevice,仅限ios
  • 核心动画层(CALayer)
  • 纹理(SKTexture,MDLTexture,MTLTexture或GLKTextureInfo)
  • SpriteKit场景(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这样做,我只需要帮助弄清楚如何做到这一点。如果这不是最好的方式,有人可以指向我可以找到仪表解决方案的文档吗?

谢谢!

答案

那是因为size这里let 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)

以上是关于如何将SKScene添加到SCNNode平面?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以像 SKScene 一样在 SCNScene 或 SCNNode 中使用“update(_ currentTime: TimeInterval)”?

将 SKScene 添加到 UIViewController?

如何阻止 iAds 在 xcode 中扭曲 SKScene?

SceneKit - 在另一个 SCNNode 上添加 SCNNode

如何在不改变世界坐标中的相对位置、大小和比例的情况下将 SCNNode 作为子节点添加到父节点

如何将 ARKit SCNNode 对象位置 SCNVector3 转换为纬度和经度? [关闭]