在 SCNPlane 上的场景套件和 swift iOS 中的 AR 套件上显示图像



我遵循本raywenderlich教程使用AR和Scene Kit检测图像。在这个例子中,他们展示了在检测到的图像上显示视频。

https://www.raywenderlich.com/6957-building-a-museum-app-with-arkit-2

我想在检测到的图像上显示图像。请帮助我如何将childNode添加到SCNNode,以便在其顶部显示图像。

这是我尝试过的代码,显示空白的白色屏幕不起作用。

DispatchQueue.main.async {
let size = imageAnchor.referenceImage.physicalSize
let imageView = UIImageView(image: UIImage(named: "BG.png")!)
let imgMaterial = SCNMaterial()
imgMaterial.diffuse.contents = imageView
let imgPlane = SCNPlane(width: size.width, height: size.height)
imgPlane.materials = [imgMaterial]
let imgNode = SCNNode(geometry: imgPlane)
imgNode.eulerAngles.x = -.pi / 2

node.addChildNode(imgNode)
node.opacity = 1
}

请帮助在检测到的图像上显示图像。提前谢谢。

我可以在检测到的图像上显示图像,但这需要大量的内存,因为代码中有什么错误。

和图像视图一样,我用下面的代码在检测到的图像上显示gif播放。

let size = imageAnchor.referenceImage.physicalSize
let imgNameFromDoc = person["actionToTake"] as! String
let documentsPathURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
let imgpath = documentsPathURL?.appendingPathComponent("/Packages/(self.selectedDatasetName)/3DScenes/(imgNameFromDoc)")
let imageData = try! Data(contentsOf: URL(fileURLWithPath: imgpath!.path))

let imageURL = UIImage.gifImageWithData(imageData)

self.gifImgView = UIImageView(image: imageURL)
let imgMaterial = SCNMaterial()
imgMaterial.diffuse.contents = self.gifImgView
let imgPlane = SCNPlane(width: CGFloat(scaleActionSize(wid: Float(size.width), hei:Float(size.height))[0]), height: CGFloat(scaleActionSize(wid: Float(size.width), hei:Float(size.height))[1]))
imgPlane.materials = [imgMaterial]
let imgNode = SCNNode(geometry: imgPlane)
imgNode.eulerAngles.x = -.pi / 2

node.addChildNode(imgNode)
node.opacity = 1

在图像扩展的帮助下,我在检测到的图像上的图像视图上显示GIF。https://github.com/kiritmodi2702/GIF-Swift/blob/master/GIF-Swift/iOSDevCenters%2BGIF.swift

如何在Swift中加载GIF图片?

我在应用程序中拖动iOSDevCenters+GIF.swift类并显示GIF。

当我使用此gif图像视图显示gif,使用图像视图显示图像时,在iPad上运行的Xcode中需要超过800 MB的内存。

有人能帮我找到这个代码中的任何内存泄漏(尝试使用无法修复的仪器(或任何错误吗。

我想你已经可以进行图像跟踪了。

当添加新的锚点时,将调用下一个方法。在这种情况下,当检测到跟踪的图像时。因此,参数节点是被跟踪的图像,您可以像教程中那样向该图像添加一个子节点。因此,您可以尝试下一个(使用ARSCNViewDelegate(:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
DispatchQueue.main.async {
let imageView = UIImageView(image: UIImage())
let imgMaterial = SCNMaterial()
imgMaterial.diffuse.contents = imageView
let imgPlane = SCNPlane(width: 0.1, height: 0.1)
imgPlane.materials = [imgMaterial]
let imgNode = SCNNode(geometry: imgPlane)
imgNode.eulerAngles.x = -.pi / 2

node.addChildNode(imgNode)
node.opacity = 1
}
}

imgNode已添加到节点中,并且该节点已添加到场景中。那么,如果没有将节点添加到场景中,会发生什么呢?你必须自己添加。因此,如果您没有使用renderer方法,下一个例子是:

self.imgNode?.position = SCNVector3(0, 0, 0)
sceneView.scene.rootNode.addChildNode(self.imgNode)

不支持将UIKit视图显示为材质属性内容。您应该直接使用指向磁盘上图像的UIImage,而不是UIImageView,或者更好的是仅使用指向磁盘中图像的StringURL。这样,图像就不会在内存中加载两次(在SceneKit和UIKit中(。

相关内容

最新更新