notes of course “iOS Application Development” from RWTH-Aachen in semester winter 19/20, from Simon Voelker and Philipp Wacker
Configuration
- ARConfiguration defines which camera and tracking algorithms are being used
- ARSession manages the camera and motion processing
// Create a session configuration
let configuration = ARWorldTrackingConfiguration()
// Run the view's session
sceneView.session.run(configuration)
// Pause the views's session
sceneView.session.pause()
ARSceneView
- Show statistics
// Show statistics such as fps and timing information
sceneView.showsStatistics = true
-Debug options
sceneView.debugOptions = [ARSCNDebugOptions.showWorldOrigin, ARSCNDebugOptions.showFeaturePoints]
- ARSCNViewDelegate: Notification as features are detected or remove.
Finding flat surfaces
- Define what planes to look for
configuration.planeDetection = [.horizontal, .vertical]
- Implement ARSCNViewDelegate methods to respond to found planes
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor){}
//_ 忽略外部参数
func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor){}
func renderer(_ renderer: SCNSceneRenderer, didRemove node: SCNNode, for anchor: ARAnchor){}
guard let planeAnchor = anchor as? ARPlaneAnchor else {return}
// 从基类向派生类转型
switch planceAnchor.alignment {
case .horizontal://...
case .vertical: //...
}
Anchors
- Different features:
- ARPlaneAnchor, ARObjectAnchor, ARImageAnchor, ARFaceAnchor
- Feature specific properties
- PlanceAnchor: alignment, center, extend, geometry,…
- ImageAnchor: referenceImage
Image Recognition with ARKit
let referenceImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil)!
configuration.detectionImages = referenceImages
//to enable continuous tracking
configuration.maximumNumberOfTrackedImages = 1
Interaction with AR
- Cast a ray into the scene and find the intersections with the real world
//get the point from which to cast the ray
let touchLocation = sender.location(in: sceneView)
//perform the hit test
let hitTestResult = sceneView.hitTest(touchLocation,types: [.existingPlaneUsingExtent])
- Array of Result:
- Type & Anchor
- Distance & Transforms