ARReferenceObject
имеет переменную name
типа String
, которая просто:
Описательное имя для ссылочного объекта.
Когда вы добавляете ARReferenceObject
в папку Assets.xcassett
s, у вас есть возможность установить имя (которое на самом деле устанавливается автоматически):
Таким образом, вы можете использовать это имя свойства для обработки того, что показывать в зависимости от обнаруженного ARReferenceObject
.
Лично я бы использовал следующий обратный вызов делегата для добавления контента, хотя это зависит от вас:
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor)
Так как такой рабочий пример может выглядеть примерно так:
//-------------------------
//MARK: - ARSCNViewDelegate
//-------------------------
extension ViewController: ARSCNViewDelegate{
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
/*
Check To See Whether AN ARObject Anhcor Has Been Detected
Get The The Associated ARReferenceObject
Get The Name Of The ARReferenceObject
*/
guard let objectAnchor = anchor as? ARObjectAnchor else { return }
let detectedObject = objectAnchor.referenceObject
guard let detectedObjectName = detectedObject.name else { return }
//Get The Extent & Center Of The ARReferenceObject
let detectedObjectExtent = detectedObject.extent
let detectedObjecCenter = detectedObject.center
//Log The Data
print("""
An ARReferenceObject Named \(detectedObjectName) Has Been Detected
The Extent Of The Object Is \(detectedObjectExtent)
The Center Of The Object Is \(detectedObjecCenter)
""")
//Create A Different Scene For Each Detected Object
node.addChildNode(createSKSceneForReferenceObject(detectedObject: detectedObject))
}
/// Creates A Unique SKScene Based On A Detected ARReferenceObject
///
/// - Parameter detectedObject: ARReferenceObject
/// - Returns: SCNNode
func createSKSceneForReferenceObject(detectedObject: ARReferenceObject) -> SCNNode{
let plane = SCNPlane(width: CGFloat(detectedObject.extent.x * 1.0),
height: CGFloat(detectedObject.extent.y * 0.7))
plane.cornerRadius = plane.width / 8
guard let validName = detectedObject.name else { return SCNNode() }
let spriteKitScene = SKScene(fileNamed: validName)
plane.firstMaterial?.diffuse.contents = spriteKitScene
plane.firstMaterial?.isDoubleSided = true
plane.firstMaterial?.diffuse.contentsTransform = SCNMatrix4Translate(SCNMatrix4MakeScale(1, -1, 1), 0, 1, 0)
let planeNode = SCNNode(geometry: plane)
planeNode.position = SCNVector3Make(detectedObject.center.x, detectedObject.center.y + 0.5, detectedObject.center.z)
return planeNode
}
}
Весь код полностью прокомментирован, поэтому он должен иметь смысл, и вы заметите, что я создал многократно используемую функцию для генерации различных SKScenes
, которые, конечно, могут быть изменены для добавления другого контента, например, SCNСцены, SCNNode и т. Д.
Я использую имя ARReferenceObject для загрузки сцены с тем же именем, но вы можете использовать оператор if / else или switch в зависимости от того, что вам нужно.
Надеюсь, это поможет ...
Надеюсь, это направит вас в правильном направлении.