İlk kez AR uygulamamı App Store'a yüklediğimde, kullanıcıların evlerinde sanal mobilya deneyip "Bu gerçek mi?" diye sorduğunu gördüğümde anladım: AR, geleceğin arayüzü.
Bu rehberde, ARKit'in temellerinden LiDAR ile gerçekçi occlusion'a kadar her şeyi öğreneceksin. IKEA, Pokemon GO veya Snapchat gibi uygulamalar yapmak mı istiyorsun? Doğru yerdesin.
İçindekiler
- ARKit Nedir?
- AR Session ve Konfigürasyonlar
- Plane Detection (Düzlem Tespiti)
- 3D Model Yerleştirme
- Image Tracking
- Face Tracking
- LiDAR ve Mesh Scanning
- RealityKit Entegrasyonu
- Performans Optimizasyonu
- Gerçek Dünya Projesi: AR Furniture App
- Sonuç ve Öneriler
ARKit Nedir? {#arkit-nedir}
ARKit, Apple'ın artırılmış gerçeklik framework'üdür. Kamera, sensörler ve machine learning'i birleştirerek gerçek dünyaya sanal içerik ekler.
ARKit Yetenekleri
Özellik | Min. iPhone | Açıklama |
|---|---|---|
**World Tracking** | 6s | Cihaz pozisyonu ve rotasyonu |
**Plane Detection** | 6s | Yatay/dikey düzlem tespiti |
**Image Tracking** | 6s | Görsel tanıma ve takip |
**Face Tracking** | X | 52 noktada yüz takibi |
**Body Tracking** | 12 | Tam vücut iskeleti |
**LiDAR Scanning** | 12 Pro | 3D mesh oluşturma |
**Object Occlusion** | 12 Pro | Gerçekçi nesne gizleme |
**Location Anchors** | 12+ | GPS tabanlı AR |
Temel Kavramlar
swift
1// AR Session: AR deneyimini yöneten ana objedir2let arSession = ARSession()3 4// AR Configuration: Hangi özelliklerin kullanılacağını belirler5let config = ARWorldTrackingConfiguration()6 7// AR Anchor: Sanal içeriğin gerçek dünyadaki konumu8let anchor = ARAnchor(name: "myObject", transform: matrix)9 10// AR Frame: Kamera görüntüsü + tracking bilgisi11let frame = arSession.currentFrameAR Session ve Konfigürasyonlar {#ar-session}
Her AR deneyimi bir session ile başlar:
swift
1import ARKit2import UIKit3 4class ARViewController: UIViewController {5 6 @IBOutlet var arView: ARSCNView!7 8 override func viewDidLoad() {9 super.viewDidLoad()10 11 arView.delegate = self12 arView.session.delegate = self13 14 // Debug options15 arView.debugOptions = [16 .showFeaturePoints,17 .showWorldOrigin,18 .showBoundingBoxes19 ]20 21 arView.autoenablesDefaultLighting = true22 }23 24 override func viewWillAppear(_ animated: Bool) {25 super.viewWillAppear(animated)26 27 let config = ARWorldTrackingConfiguration()28 config.planeDetection = [.horizontal, .vertical]29 config.environmentTexturing = .automatic30 31 // LiDAR varsa32 if ARWorldTrackingConfiguration.supportsSceneReconstruction(.mesh) {33 config.sceneReconstruction = .mesh34 }35 36 arView.session.run(config)37 }38}Configuration Türleri
swift
1// World Tracking - En kapsamlı, 6DoF2let worldConfig = ARWorldTrackingConfiguration()3 4// Image Tracking - Sadece resim takibi5let imageConfig = ARImageTrackingConfiguration()6imageConfig.trackingImages = referenceImages7imageConfig.maximumNumberOfTrackedImages = 48 9// Face Tracking - TrueDepth kamera gerekli10let faceConfig = ARFaceTrackingConfiguration()11faceConfig.maximumNumberOfTrackedFaces = 112 13// Body Tracking - A12+ chip gerekli14let bodyConfig = ARBodyTrackingConfiguration()Plane Detection (Düzlem Tespiti) {#plane-detection}
Düzlem tespiti, AR'ın temelidir. Masaya bir obje koymak için önce masayı tespit etmelisin:
swift
1extension ARViewController: ARSCNViewDelegate {2 3 func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {4 guard let planeAnchor = anchor as? ARPlaneAnchor else { return }5 6 let planeNode = createPlaneNode(for: planeAnchor)7 node.addChildNode(planeNode)8 9 // Haptic feedback10 DispatchQueue.main.async {11 let generator = UIImpactFeedbackGenerator(style: .light)12 generator.impactOccurred()13 }14 }15 16 private func createPlaneNode(for planeAnchor: ARPlaneAnchor) -> SCNNode {17 let extent = planeAnchor.planeExtent18 19 let plane = SCNPlane(20 width: CGFloat(extent.width),21 height: CGFloat(extent.height)22 )23 24 let material = SCNMaterial()25 material.diffuse.contents = UIColor.systemBlue.withAlphaComponent(0.3)26 plane.materials = [material]27 28 let planeNode = SCNNode(geometry: plane)29 planeNode.eulerAngles.x = -.pi / 230 31 return planeNode32 }33}💡 Pro Tip: Plane detection tamamlandığında planeDetection = [] yaparak pil tasarrufu sağla!
3D Model Yerleştirme {#model-yerlestirme}
Tespit edilen düzleme 3D model yerleştirmek için:
swift
1override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {2 guard let touch = touches.first else { return }3 let location = touch.location(in: arView)4 5 if let query = arView.raycastQuery(6 from: location,7 allowing: .estimatedPlane,8 alignment: .horizontal9 ) {10 let results = arView.session.raycast(query)11 12 if let firstResult = results.first {13 placeObject(at: firstResult)14 }15 }16}17 18private func placeObject(at raycastResult: ARRaycastResult) {19 guard let modelScene = SCNScene(named: "art.scnassets/chair.scn"),20 let modelNode = modelScene.rootNode.childNode(21 withName: "chair",22 recursively: true23 )?.clone() else {24 return25 }26 27 let transform = raycastResult.worldTransform28 modelNode.position = SCNVector3(29 transform.columns.3.x,30 transform.columns.3.y,31 transform.columns.3.z32 )33 34 modelNode.scale = SCNVector3(0.01, 0.01, 0.01)35 36 let anchor = ARAnchor(name: "furniture", transform: transform)37 arView.session.add(anchor: anchor)38 39 arView.scene.rootNode.addChildNode(modelNode)40}Image Tracking {#image-tracking}
Gerçek dünya görsellerini tanıyıp üzerine içerik ekle:
swift
1class ImageTrackingViewController: UIViewController {2 3 override func viewWillAppear(_ animated: Bool) {4 super.viewWillAppear(animated)5 6 guard let referenceImages = ARReferenceImage.referenceImages(7 inGroupNamed: "AR Resources",8 bundle: nil9 ) else {10 fatalError("Reference images bulunamadı!")11 }12 13 let config = ARImageTrackingConfiguration()14 config.trackingImages = referenceImages15 config.maximumNumberOfTrackedImages = 416 17 arView.session.run(config)18 }19}20 21extension ImageTrackingViewController: ARSCNViewDelegate {22 23 func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {24 guard let imageAnchor = anchor as? ARImageAnchor else { return nil }25 26 let referenceImage = imageAnchor.referenceImage27 let imageName = referenceImage.name ?? "unknown"28 29 print("Tespit edildi: \(imageName)")30 31 // Resmin üzerine içerik ekle32 let plane = SCNPlane(33 width: referenceImage.physicalSize.width,34 height: referenceImage.physicalSize.height35 )36 37 plane.firstMaterial?.diffuse.contents = UIColor.green.withAlphaComponent(0.5)38 39 let planeNode = SCNNode(geometry: plane)40 planeNode.eulerAngles.x = -.pi / 241 42 return planeNode43 }44}Face Tracking {#face-tracking}
Snapchat tarzı face filters için:
swift
1class FaceTrackingViewController: UIViewController {2 3 override func viewWillAppear(_ animated: Bool) {4 super.viewWillAppear(animated)5 6 guard ARFaceTrackingConfiguration.isSupported else {7 showAlert("Face tracking bu cihazda desteklenmiyor")8 return9 }10 11 let config = ARFaceTrackingConfiguration()12 config.maximumNumberOfTrackedFaces = 113 14 arView.session.run(config)15 }16}17 18extension FaceTrackingViewController: ARSCNViewDelegate {19 20 func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {21 guard let faceAnchor = anchor as? ARFaceAnchor else { return }22 23 let blendShapes = faceAnchor.blendShapes24 25 // Göz kırpma tespiti26 if let eyeBlinkLeft = blendShapes[.eyeBlinkLeft]?.floatValue,27 let eyeBlinkRight = blendShapes[.eyeBlinkRight]?.floatValue {28 if eyeBlinkLeft > 0.5 && eyeBlinkRight > 0.5 {29 // İki göz de kapalı!30 }31 }32 33 // Gülümseme tespiti34 if let smileLeft = blendShapes[.mouthSmileLeft]?.floatValue,35 let smileRight = blendShapes[.mouthSmileRight]?.floatValue {36 let smileIntensity = (smileLeft + smileRight) / 237 // Gülümseme efekti uygula38 }39 }40}🎯 52 Blend Shapes: Apple, yüz ifadelerini 52 farklı noktada track eder!
LiDAR ve Mesh Scanning {#lidar-mesh}
iPhone 12 Pro ve sonrasında LiDAR sensörü var:
swift
1class LiDARViewController: UIViewController {2 3 override func viewWillAppear(_ animated: Bool) {4 super.viewWillAppear(animated)5 6 let config = ARWorldTrackingConfiguration()7 8 if ARWorldTrackingConfiguration.supportsSceneReconstruction(.mesh) {9 config.sceneReconstruction = .mesh10 arView.debugOptions.insert(.showSceneUnderstanding)11 }12 13 // Person occlusion14 if ARWorldTrackingConfiguration.supportsFrameSemantics(.personSegmentationWithDepth) {15 config.frameSemantics.insert(.personSegmentationWithDepth)16 }17 18 arView.session.run(config)19 }20}RealityKit Entegrasyonu {#realitykit}
RealityKit, SceneKit'in modern alternatifi:
swift
1import RealityKit2import ARKit3 4class RealityKitViewController: UIViewController {5 6 @IBOutlet var arView: ARView!7 8 override func viewDidLoad() {9 super.viewDidLoad()10 11 let config = ARWorldTrackingConfiguration()12 config.planeDetection = [.horizontal]13 arView.session.run(config)14 15 // Coaching overlay16 let coachingOverlay = ARCoachingOverlayView()17 coachingOverlay.session = arView.session18 coachingOverlay.goal = .horizontalPlane19 arView.addSubview(coachingOverlay)20 21 let tapGesture = UITapGestureRecognizer(22 target: self,23 action: #selector(handleTap)24 )25 arView.addGestureRecognizer(tapGesture)26 }27 28 @objc func handleTap(_ gesture: UITapGestureRecognizer) {29 let location = gesture.location(in: arView)30 31 if let result = arView.raycast(32 from: location,33 allowing: .estimatedPlane,34 alignment: .horizontal35 ).first {36 let anchor = AnchorEntity(world: result.worldTransform)37 38 Task {39 do {40 let model = try await ModelEntity.loadModel(named: "toy_robot")41 model.generateCollisionShapes(recursive: true)42 43 anchor.addChild(model)44 arView.scene.addAnchor(anchor)45 46 // Gesture'ları ekle47 arView.installGestures([.translation, .rotation, .scale], for: model)48 } catch {49 print("Model yüklenemedi: \(error)")50 }51 }52 }53 }54}Performans Optimizasyonu {#performans}
AR uygulamaları pil ve CPU yoğun:
swift
1// Thermal state kontrol2if ProcessInfo.processInfo.thermalState == .serious {3 arView.renderOptions = [.disableMotionBlur, .disableDepthOfField]4 arView.contentScaleFactor = 1.05}6 7// Plane detection'ı kapat8func stopPlaneDetection() {9 guard let config = arView.session.configuration as? ARWorldTrackingConfiguration else { return }10 config.planeDetection = []11 arView.session.run(config)12}13 14// LOD (Level of Detail)15let distance = simd_distance(cameraPosition, objectPosition)16if distance > 5.0 {17 node.geometry = lowPolyModel18} else {19 node.geometry = highPolyModel20}Gerçek Dünya Projesi: AR Furniture App {#ar-furniture}
IKEA Place gibi bir uygulama yapısı:
swift
1import SwiftUI2import RealityKit3 4struct ARFurnitureView: View {5 @StateObject private var viewModel = ARFurnitureViewModel()6 7 var body: some View {8 ZStack {9 ARViewContainer(viewModel: viewModel)10 .edgesIgnoringSafeArea(.all)11 12 VStack {13 Spacer()14 15 ScrollView(.horizontal) {16 HStack(spacing: 16) {17 ForEach(viewModel.furnitureItems) { item in18 FurnitureButton(item: item) {19 viewModel.selectFurniture(item)20 }21 }22 }23 .padding()24 }25 .background(.ultraThinMaterial)26 }27 }28 }29}30 31@MainActor32class ARFurnitureViewModel: ObservableObject {33 @Published var selectedFurniture: FurnitureItem?34 35 let furnitureItems = [36 FurnitureItem(id: "chair", name: "Sandalye", modelName: "chair.usdz", price: 299),37 FurnitureItem(id: "table", name: "Masa", modelName: "table.usdz", price: 599),38 FurnitureItem(id: "sofa", name: "Kanepe", modelName: "sofa.usdz", price: 1299),39 ]40 41 func selectFurniture(_ item: FurnitureItem) {42 selectedFurniture = item43 UIImpactFeedbackGenerator(style: .medium).impactOccurred()44 }45}Easter Egg
Gizli bir bilgi buldun!
Bu bölümde gizli bir bilgi var. Keşfetmek ister misin?
Okuyucu Ödülü
Tebrikler! Bu yazıyı sonuna kadar okuduğun için sana özel bir hediyem var:
ALTIN İPUCU
Bu yazının en değerli bilgisi
Bu ipucu, yazının en önemli çıkarımını içeriyor.
Sonuç ve Öneriler {#sonuc-ve-oneriler}
ARKit ile yapabileceklerin sınırı hayal gücün. İşte başlangıç için öneriler:
- Basit başla - Önce düzlem tespiti ve model yerleştirme
- Apple Sample Code - developer.apple.com/augmented-reality
- RealityKit'e geç - Özellikle visionOS hedefliyorsan
- Performance first - AR, pil ve CPU yoğun; optimize et
Kaynaklar
- Apple Developer:: [ARKit Documentation](https://developer.apple.com/documentation/arkit)
- Apple Developer:: [RealityKit Documentation](https://developer.apple.com/documentation/realitykit)
- WWDC 2023:: [Build spatial experiences with RealityKit](https://developer.apple.com/videos/play/wwdc2023/10080/)
*AR, geleceğin arayüzü. Şimdi öğren, yarın öncü ol.* 🥽

