ARKit Demo: Artırılmış Gerçeklik Film Yapımı

Yayınlanan: 2022-03-11

AR ve VR ana akım haline geliyor ve tüm önde gelen yüksek teknoloji şirketleri onları takip ediyor: Apple'da ARKit, Google'da ARCore ve Microsoft'un kendi HoloLens'i var (ve tabii ki Unity var). Ve birkaç uygulamanın çok fazla ilgi görmesiyle, Artırılmış gerçeklik uygulaması geliştirme, mobil geliştiriciler için çok arzu edilen bir beceri haline geliyor.

Bu makalede, dönen bir küpten fazlasını yapacak basit ama anlamlı küçük bir uygulama göstermek istiyorum. Kim dönen küplere ihtiyaç duyar ki? Matrix'i yapalım.

ARKit'e Giriş

ARKit, iOS cihazları için AR uygulamaları oluşturmaya yönelik bir Apple çerçevesidir. Bununla birkaç oluşturucu kullanılabilir: 2B nesneler için SpriteKit, 3B için SceneKit ve özel bir oluşturucu uygulamak istiyorsak Metal.

Bu demo için, tamamen işlenmiş 3B nesneleri (bıçaklar) oluşturmak ve yerleştirmek için SceneKit'i kullanacağız.

görüntü: oluşturucular arasındaki ayrım

ARKit v2'den, ARKit'te beş tür yapılandırma desteklenir:

AROrientationTrackingConfiguration – Yalnızca cihazın yönünü izlemek istediğinizde (örneğin, bir yıldız takımyıldızı uygulaması için). Bu konfigürasyon ile yan adım gibi fiziksel hareketler izlenmez ve sahnedeki nesnelerin konumunu veya yönünü etkilemez.

ARWorldTrackingConfiguration – Çoğu insanın artırılmış gerçeklik olarak değerlendireceğini desteklediğinden, bu muhtemelen AR için en sık kullanılan yapılandırmadır. Örnekler, sanal evcil hayvan veya Pokemon avı uygulamalarını içerir.

ARFaceTrackingConfiguration – Bu yapılandırma, bir TrueDepth kamera (Face ID gibi) gerektirdiğinden şu anda yalnızca iPhone X tarafından desteklenmektedir. Bu yapılandırma, yüzdeki özellikleri ve bunun nötr yüz ifadesinden göreli kaymasını izler (örneğin, kullanıcıların moda güneş gözlüklerini sipariş etmeden önce deneyebilecekleri bir uygulama).

ARImageTrackingConfiguration – Bir dizi işaretçiniz varsa ve işaretçiden atlayan hayvanları göstermek istiyorsanız, bu konfigürasyon tam size göre. Bunların kart benzeri işaretleyiciler olması gerekmez, ancak herhangi bir 2D resim olması gerekir. Kameranı Mona Lisa'ya doğrultabilirsin, o başını çevirip sana bir şey söylerdi. Dezavantajı ise görüntü işaretçisinin fiziksel boyutunun ne olduğunu önceden söylemeniz gerekmesidir.

ARObjectScanningConfiguration – Bu konfigürasyon, ARImageTrackingConfiguration'ın 3B versiyonudur.

Bu demoda, sahneye bıçaklar ve mermiler ekleyeceğiz ve altı serbestlik derecesine sahip olmak istiyoruz, bu nedenle uygun araç ARWorldTrackingConfiguration.

Uygulama Konsepti

Matrix'i izleyen herkes Neo'nun (Keanu Reeves) mermilerden kaçtığını ve onları havada durdurduğunu hatırlayabilir. Uygulamamız, bu sahneyi canlı bir kamera beslemesinden yeniden oluşturmamıza yardımcı olacak. Böylece Neo benzeri güçleri gösteren özel videolar oluşturabiliyoruz.

Uygulamamız mermi ve bıçakların 3 boyutlu modellerine sahip olacaktır. Filminde kaç mermi veya bıçak istediği kullanıcıya bağlıdır. Biraz zaman geçirmek ve başka modeller eklemek isterseniz, uygulama kodu açık kaynaklıdır ve GitHub'da mevcuttur (https://github.com/altaibayar/toptal_ar_video_maker). Bu tam bir AR eğitimi olmasa da, iOS'ta AR Uygulaması geliştirmeye girmeye çalışıyorsanız demo ve kaynak değerli bir kaynak olmalıdır.

Amaçlanan kullanım senaryosu aşağıdaki gibidir:

  1. bir arkadaşınızı Neo olarak giydirin (Uygulamanın çalışması için kesinlikle gerekli değildir, ancak bunu yaparken iyi görünebilir).
  2. “Neo”dan sizden yaklaşık 10 metre (30 fit) uzakta durmasını isteyin.
  3. Uygulamayı başlatın ve yer düzlemini tarayın.
  4. “Neo”da uçan mermiler ve bıçaklar ekleyin.
  5. "Neo" mermilerden kaçmak veya mermileri durdurmak için bazı harika hareketler yaparken videoyu kaydetmek için kayıt düğmesini basılı tutun
  6. kayıt düğmesini bırakın ve videoyu kitaplığınıza kaydedin.

Uygulamayı Oluşturma

Daha önce de belirtildiği gibi, sahnenin 360 derecesini kaydederken özgürce hareket edebilmek ve mermi ve bıçakların kamera hareketini uygun şekilde izlemesini istiyoruz.

Gösteri amacıyla, yalnızca iki tür sanal nesneye sahip olacağız: bıçaklar ve pompalı tüfek mermileri.

Bıçaklar ayrıntılı nesnelerdir ve https://poly.google.com/view/3TnnfzKfHrq adresindeki ücretsiz modeli kullanacağım (Teşekkürler Andrew).

Ancak av tüfeği mermileri basit küresel nesnelerdir ve onları basitçe kodlayabiliriz. Çeşitlilik için onları metalik ve kırmızı-sıcak yapacağız. Bir av tüfeğini taklit ettiğimiz için, onları gruplanmış kümeler olarak da oluşturacağız. Kümelemeyi çok fazla güçlük çekmeden anlamlı kılmak için GamplayKit'ten Gauss rastgele sayı üretecini kullanabiliriz.

GameplayKit, rastgele gürültü üretimine, durum makinesine, yapay zekaya veya olasılığa dayalı karar vermeye ihtiyaç duyduğunuzda kullanışlı olan kullanışlı bir araçtır.

 override init() { super.init(); // generate 50 gaussian distributed position around [0, 0, 0] let positions = Randomness.gaussian(center: SCNVector3Zero, count: 50); for pos in positions { let node = SCNNode(geometry: sphereGeometry()); node.position = pos; self.addChildNode(node); } } private func sphereGeometry() -> SCNGeometry { // radius of one projectile sphere is 5mm/0.2inch let sphere = SCNSphere(radius: 0.005); // sphere is reddish sphere.firstMaterial?.diffuse.contents = UIColor.red; // reflection on light is gray/silver sphere.firstMaterial?.reflective.contents = UIColor.gray; // metalness is 0.3 sphere.firstMaterial?.metalness.contents = 0.3; // shading should be realistic sphere.firstMaterial?.lightingModel = .physicallyBased; return sphere; }

Bıçaklar için benzer rasgele ofset mantığı kullanılabilir, ancak kümeler gibi davranmadıkları için basit bir rasgele dağılım kullanılabilir.

Uygulama Mimarisi

Hangi mimari paradigmanın en iyi olduğu konusundaki tartışmaları araştırmak bu demonun kapsamı dışındadır. Bu konuyu ele alan birçok makale var.

Bunun yerine, bağlantılı GitHub projesinde yolunuzu bulmak için bir kılavuz olarak projenin yapısını ortaya koyacağım: ana bileşenler nelerdir, nasıl bağlanırlar ve neden seçildiler.

Uygulamanın yalnızca üç ekranı vardır:

PermissionViewController – Kullanıcıdan gerekli mobil özelliklere uygulama erişimi vermesini istediğimiz ekran.

  • Kamera – Açıkçası
  • Galeri – Kaydedilen videoyu ve mikrofon girişini kaydetmek için
  • Mikrofon – Videoyu oluşturmak için kullandığım bir kitaplık için izin gerekiyor (varsayılan olarak mikrofondan gelen ses, bir ses parçasının kaynağı olarak kullanılacaktır).

ExportViewController – Bu ekran kaydedilmiş bir videoyu gösterir ve videoyu paylaşma veya kaydetme seçeneklerini sunar.

MainViewController – Tüm sihir burada gerçekleşir.

Tecrübelerime göre, ARSession, ARConfiguration ve tüm benzersiz SCNNode türleri gibi gerekli tüm ARKit sınıflarını sarmanız en iyisidir. Bu şekilde, kod kendi kendini açıklayıcıdır.

ARSession, ToptalARSession'a miras alınır ve yeni oturum sınıfının yalnızca üç yöntemi vardır: gereken her şeyi ayarladığımız sınıf yapıcısı ve resetTracking ve pauseTracking yöntemleri.

Uygulama, dört benzersiz SCNNode türünü tanır:

  • KnifeNode – Bir bıçak 3B nesnesini temsil eder ve geometrisi olarak otomatik olarak bir 3B bıçağı yükler.
  • BulletsNode – Bu düğüm, bir dizi av tüfeği mermisini temsil eder. Rastgele Gauss gürültüsü, renkler ve fiziksel aydınlatma modu otomatik olarak ayarlanır.

    KnifeNode veya BulletsNode kullanan sınıflarda özel veya ek çalışma gerekmez ve daha fazla türde 3B nesne eklemek için uygulamayı özelleştirmek için şablon olarak kullanılabilirler.

  • ReticleNode – Bıçakların veya mermilerin nereye ekleneceğini göstermek için zeminin üzerindeki sahnede görünen bir 3B modeli sarar.
  • DirectionalLightNode – Bu, aşağıyı gösteren dikey bir ışığı temsil eden bir düğümdür.

Referanslar ve Krediler

Bıçak modeli: https://poly.google.com/view/3TnnfzKfHrq

SCNScene'den kayıt: https://github.com/svtek/SceneKitVideoRecorder

Düğme simgeleri, ARKit demo uygulaması: https://developer.apple.com/documentation/arkit/handling_3d_interaction_and_ui_controls_in_augmented_reality