哪个图像被用作 ARSceneView 中的参考?
Which image is being used as reference in ARSceneView?
我目前正在制作一个使用图像跟踪的 AR 应用程序。
我希望它在参考图像文件夹中有 2 张图像(图像 A:~670x210,图像 B:~1123x794)。
如何查看摄像头检测到的是哪张图片?
例如,如果相机看到的是图像 A - 我想制作一个两倍于物理对象大小的平面,如果它看到的是图像 B - 我想制作一个与物理对象大小相同的平面。
如果需要,这是我的代码片段:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Create a session configuration
let configuration = ARImageTrackingConfiguration()
if let trackedImage = ARReferenceImage.referenceImages(inGroupNamed: "ARpaperImage", bundle: Bundle.main) {
configuration.trackingImages = trackedImage
configuration.maximumNumberOfTrackedImages = 1
}
// Run the view's session
sceneView.session.run(configuration)
}
// MARK: - ARSCNViewDelegate
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
let node = SCNNode()
if let imageAnchor = anchor as? ARImageAnchor {
let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)
plane.firstMaterial?.diffuse.contents = UIColor(white: 1.0, alpha: 0,5)
let planeNode = SCNNode(geometry: plane)
planeNode.eulerAngles.x = -.pi / 2
node.addChildNode(planeNode)
}
return node
}
ARReferenceImage
有一个 name
属性,您可以使用它来确定检测到哪个 ReferenceImage
,这很简单:
A descriptive name for the image
因此,当您将 ARReferenceImages
放入您的资源包时,您可以并且(可能已经)给它们命名,例如:
您可以在以下委托回调中使用这些名称来处理您的要求。
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor)
因此让我们假设我们有两个 ARReferenceImages
叫做 Brown 和 Choco。使用这些名称,我们可以创建逻辑来显示不同的内容,例如:
//-------------------------
//MARK: - ARSCNViewDelegate
//-------------------------
extension ViewController: ARSCNViewDelegate{
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
//1. Check We Have Detected An ARImageAnchor
guard let validAnchor = anchor as? ARImageAnchor, let referenceImageName = validAnchor.referenceImage.name else { return }
//2. Get The Physical Size Of The Reference Image (This Is Specificed When You Create Your Target In The ARResource Bundle)
let physicalSizeOfReferenceImage = CGSize(width: validAnchor.referenceImage.physicalSize.width, height: validAnchor.referenceImage.physicalSize.height)
///3. Log The Data For Debugging Purposes
print("""
Detected ARAnchorID = \(validAnchor.identifier)
Detected Reference Image Name = \(referenceImageName)
Detected Reference Image Physical Size = (width) \(physicalSizeOfReferenceImage.width),
Detected Reference Image Physical Size = (height) \(physicalSizeOfReferenceImage.height)
""")
//4. Perform Instanciation & Other Login Based On The Reference Image Detected
if referenceImageName == "Brown"{
node.addChildNode(planeNodeOfSize(CGSize(width: physicalSizeOfReferenceImage.width * 2, height: physicalSizeOfReferenceImage.height * 2)))
}else if referenceImageName == "Choco"{
node.addChildNode(planeNodeOfSize(CGSize(width: physicalSizeOfReferenceImage.width, height: physicalSizeOfReferenceImage.height)))
}
}
/// Generates An SCNNode With An SCNPlaneGeometry Of A Specified Width & Height
///
/// - Parameter size: CGSize
/// - Returns: SCNNode
func planeNodeOfSize(_ size: CGSize) -> SCNNode{
//1. Create An SCNPlane Of Our Chosen Size
let planeNode = SCNNode()
let planeGeometry = SCNPlane(width: size.width, height: size.height )
planeGeometry.firstMaterial?.diffuse.contents = UIColor.white
planeNode.opacity = 0.25
planeNode.geometry = planeGeometry
//2. Rotate The PlaneNode To Horizontal
planeNode.eulerAngles.x = -.pi/2
//3. Return Our Node
return planeNode
}
}
希望对您有所帮助...
我目前正在制作一个使用图像跟踪的 AR 应用程序。 我希望它在参考图像文件夹中有 2 张图像(图像 A:~670x210,图像 B:~1123x794)。
如何查看摄像头检测到的是哪张图片? 例如,如果相机看到的是图像 A - 我想制作一个两倍于物理对象大小的平面,如果它看到的是图像 B - 我想制作一个与物理对象大小相同的平面。
如果需要,这是我的代码片段:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Create a session configuration
let configuration = ARImageTrackingConfiguration()
if let trackedImage = ARReferenceImage.referenceImages(inGroupNamed: "ARpaperImage", bundle: Bundle.main) {
configuration.trackingImages = trackedImage
configuration.maximumNumberOfTrackedImages = 1
}
// Run the view's session
sceneView.session.run(configuration)
}
// MARK: - ARSCNViewDelegate
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
let node = SCNNode()
if let imageAnchor = anchor as? ARImageAnchor {
let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)
plane.firstMaterial?.diffuse.contents = UIColor(white: 1.0, alpha: 0,5)
let planeNode = SCNNode(geometry: plane)
planeNode.eulerAngles.x = -.pi / 2
node.addChildNode(planeNode)
}
return node
}
ARReferenceImage
有一个 name
属性,您可以使用它来确定检测到哪个 ReferenceImage
,这很简单:
A descriptive name for the image
因此,当您将 ARReferenceImages
放入您的资源包时,您可以并且(可能已经)给它们命名,例如:
您可以在以下委托回调中使用这些名称来处理您的要求。
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor)
因此让我们假设我们有两个 ARReferenceImages
叫做 Brown 和 Choco。使用这些名称,我们可以创建逻辑来显示不同的内容,例如:
//-------------------------
//MARK: - ARSCNViewDelegate
//-------------------------
extension ViewController: ARSCNViewDelegate{
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
//1. Check We Have Detected An ARImageAnchor
guard let validAnchor = anchor as? ARImageAnchor, let referenceImageName = validAnchor.referenceImage.name else { return }
//2. Get The Physical Size Of The Reference Image (This Is Specificed When You Create Your Target In The ARResource Bundle)
let physicalSizeOfReferenceImage = CGSize(width: validAnchor.referenceImage.physicalSize.width, height: validAnchor.referenceImage.physicalSize.height)
///3. Log The Data For Debugging Purposes
print("""
Detected ARAnchorID = \(validAnchor.identifier)
Detected Reference Image Name = \(referenceImageName)
Detected Reference Image Physical Size = (width) \(physicalSizeOfReferenceImage.width),
Detected Reference Image Physical Size = (height) \(physicalSizeOfReferenceImage.height)
""")
//4. Perform Instanciation & Other Login Based On The Reference Image Detected
if referenceImageName == "Brown"{
node.addChildNode(planeNodeOfSize(CGSize(width: physicalSizeOfReferenceImage.width * 2, height: physicalSizeOfReferenceImage.height * 2)))
}else if referenceImageName == "Choco"{
node.addChildNode(planeNodeOfSize(CGSize(width: physicalSizeOfReferenceImage.width, height: physicalSizeOfReferenceImage.height)))
}
}
/// Generates An SCNNode With An SCNPlaneGeometry Of A Specified Width & Height
///
/// - Parameter size: CGSize
/// - Returns: SCNNode
func planeNodeOfSize(_ size: CGSize) -> SCNNode{
//1. Create An SCNPlane Of Our Chosen Size
let planeNode = SCNNode()
let planeGeometry = SCNPlane(width: size.width, height: size.height )
planeGeometry.firstMaterial?.diffuse.contents = UIColor.white
planeNode.opacity = 0.25
planeNode.geometry = planeGeometry
//2. Rotate The PlaneNode To Horizontal
planeNode.eulerAngles.x = -.pi/2
//3. Return Our Node
return planeNode
}
}
希望对您有所帮助...