ARKit Demo: الواقع المعزز لصناعة الأفلام

نشرت: 2022-03-11

أصبح الواقع المعزز والواقع الافتراضي سائدين ، وتتبعهما جميع كبرى شركات التكنولوجيا الفائقة: لدى Apple ARKit ، و Google لديها ARCore و Microsoft لديها HoloLens الخاصة بها (وبعد ذلك ، بالطبع ، هناك Unity). ومع وجود عدد قليل من التطبيقات التي تلقت الكثير من الاهتمام العام ، أصبح تطوير تطبيقات الواقع المعزز مهارة مرغوبة جدًا لمطوري الأجهزة المحمولة.

في هذه المقالة ، أود أن أوضح تطبيقًا صغيرًا بسيطًا وذا مغزى من شأنه أن يفعل أكثر من مجرد مكعب دوار. من يحتاج إلى مكعبات دوارة على أي حال؟ لنجعل المصفوفة.

مقدمة إلى ARKit

ARKit هو إطار عمل Apple لإنشاء تطبيقات AR لأجهزة iOS. يمكن استخدام العديد من العارضين معها: SpriteKit للكائنات ثنائية الأبعاد ، و SceneKit للثلاثي الأبعاد ، والمعدن إذا أردنا تنفيذ عارض مخصص.

في هذا العرض التوضيحي ، سنستخدم SceneKit لتصيير ووضع كائنات ثلاثية الأبعاد كاملة العرض (سكاكين).

الصورة: التمييز بين العارضين

من ARKit v2 ، يتم دعم خمسة أنواع من التكوين في ARKit:

AROrientationTrackingConfiguration - عندما تريد تتبع اتجاه الجهاز فقط (على سبيل المثال ، لتطبيق كوكبة النجوم). باستخدام هذا التكوين ، لا يتم تتبع الحركات الجسدية مثل التنقل الجانبي ولن تؤثر على موضع أو اتجاه الكائنات في المشهد.

ARWorldTrackingConfiguration - ربما يكون هذا هو التكوين الأكثر استخدامًا للواقع المعزز لأنه يدعم ما قد يعتبره معظم الناس الواقع المعزز. تشمل الأمثلة تطبيقات الحيوانات الأليفة الافتراضية أو تطبيقات صيد بوكيمون.

ARFaceTrackingConfiguration - هذا التكوين مدعوم حاليًا فقط بواسطة iPhone X لأنه يتطلب كاميرا TrueDepth (مثل Face ID). يتتبع هذا التكوين الميزات الموجودة على الوجه والإزاحة النسبية لها عن تعبيرات الوجه المحايدة (على سبيل المثال ، تطبيق يمكن للمستخدمين من خلاله تجربة النظارات الشمسية العصرية قبل طلبها).

ARImageTrackingConfiguration - إذا كان لديك مجموعة من العلامات وتريد إظهار الحيوانات وهي تقفز خارج العلامة ، فإن هذا التكوين مناسب لك. لا يجب أن تكون هذه علامات تشبه البطاقة ، ولكن أي صورة ثنائية الأبعاد. يمكنك توجيه الكاميرا نحو الموناليزا ، وهي تدير رأسها وتخبرك بشيء. العيب هو أنه عليك أن تقول مقدمًا ما هو الحجم المادي لعلامة الصورة.

ARObjectScanningConfiguration - هذا التكوين هو الإصدار ثلاثي الأبعاد من ARImageTrackingConfiguration.

في هذا العرض التوضيحي ، سنضيف السكاكين والرصاص إلى المشهد ، ونود أن نحصل على ست درجات من الحرية ، لذا فإن الأداة المناسبة هي ARWorldTrackingConfiguration.

مفهوم التطبيق

يمكن لأي شخص شاهد The Matrix أن يتذكر Neo (Keanu Reeves) وهو يتفادى الرصاص ويوقفه في الجو. سيساعدنا تطبيقنا في إعادة إنشاء هذا المشهد من بث الكاميرا الحية. وبالتالي ، يمكننا إنشاء مقاطع فيديو مخصصة توضح قوى شبيهة بالنيو.

سيحتوي تطبيقنا على نماذج ثلاثية الأبعاد من الرصاص والسكاكين. يعود الأمر للمستخدم في عدد الرصاصات أو السكاكين التي يريدها في فيلمه. إذا كنت ترغب في قضاء بعض الوقت وإضافة طرز أخرى ، فإن كود التطبيق مفتوح المصدر ومتوفر على GitHub (https://github.com/altaibayar/toptal_ar_video_maker). في حين أن هذا ليس برنامجًا تعليميًا كاملاً للواقع المعزز ، يجب أن يكون العرض التوضيحي والمصدر مورداً قيماً إذا كنت تحاول الدخول في تطوير تطبيق AR على iOS.

سيناريو حالة الاستخدام المقصود كما يلي:

  1. لديك صديق يرتدي زي Neo (ليس ضروريًا تمامًا لتشغيل التطبيق ، ولكن قد يبدو جيدًا أيضًا أثناء قيامنا بذلك).
  2. اطلب من "نيو" الوقوف على بعد 10 أمتار (30 قدمًا) منك.
  3. ابدأ التطبيق وافحص المستوى الأرضي.
  4. أضف الرصاص والسكاكين المتطايرة على "نيو".
  5. اضغط مع الاستمرار على زر التسجيل لتسجيل الفيديو بينما يقوم "Neo" بتنفيذ بعض الحركات الرائعة في تفادي أو إيقاف الرصاص
  6. حرر زر التسجيل واحفظ الفيديو في مكتبتك.

بناء التطبيق

كما ذكرنا سابقًا ، نريد أن نكون قادرين على التحرك بحرية أثناء تسجيل 360 مشهدًا بالكامل وأن نجعل الرصاص والسكاكين يتتبعان حركة الكاميرا بشكل مناسب.

لأغراض العرض التوضيحي ، سيكون لدينا نوعان فقط من العناصر الافتراضية: السكاكين ورصاص البنادق.

السكاكين عبارة عن كائنات مفصلة وسأستخدم النموذج المجاني من https://poly.google.com/view/3TnnfzKfHrq (شكرًا أندرو).

ومع ذلك ، فإن طلقات البندقية عبارة عن كائنات كروية بسيطة ويمكننا ببساطة ترميزها. سنجعلها معدنية وحمراء اللون من أجل التنوع. نظرًا لأننا نحاكي بندقية ، فسننشئها أيضًا كمجموعات مجمعة. لجعل التجميع منطقيًا دون الكثير من المتاعب ، يمكننا استخدام مولد الأرقام العشوائية الغاوسية من GamplayKit.

GameplayKit هي أداة مفيدة وسهلة الاستخدام كلما احتجت إلى توليد ضوضاء عشوائي ، أو آلة حالة ، أو ذكاء اصطناعي ، أو اتخاذ قرار قائم على الاحتمالات.

 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; }

يمكن استخدام منطق إزاحة عشوائي مماثل للسكاكين ، ولكن نظرًا لأنها لا تتصرف كعناقيد ، يمكن استخدام توزيع عشوائي بسيط.

هندسة التطبيقات

إنه خارج نطاق هذا العرض التوضيحي الخوض في مناقشات أي نموذج معماري هو الأفضل. هناك العديد من المقالات التي تتعمق في هذا الموضوع.

بدلاً من ذلك ، سأقوم فقط بوضع هيكل المشروع كدليل لإيجاد طريقك حول مشروع GitHub المرتبط: ما هي المكونات الرئيسية ، وكيف يتم توصيلها ، ولماذا تم اختيارها.

التطبيق يحتوي على ثلاث شاشات فقط:

PermissionViewController - الشاشة التي نطلب فيها من المستخدم منح التطبيق حق الوصول إلى ميزات الهاتف المحمول المطلوبة.

  • الكاميرا - من الواضح
  • المعرض - لحفظ إدخال الفيديو والميكروفون المسجل
  • الميكروفون - إذن مطلوب من مكتبة أستخدمها لإنشاء الفيديو (افتراضيًا ، سيتم استخدام الصوت من الميكروفون كمصدر لمسار صوتي).

ExportViewController - تعرض هذه الشاشة مقطع فيديو مسجل وتقدم خيارات لمشاركة الفيديو أو حفظه.

MainViewController - كل السحر يحدث هنا.

من واقع خبرتي ، من الأفضل أن تقوم بلف جميع فصول ARKit الضرورية مثل ARSession و ARConfiguration وجميع الأنواع الفريدة من SCNNode. بهذه الطريقة ، يكون الرمز واضحًا بذاته.

يتم توريث ARSession في ToptalARSession ، ولا تحتوي فئة الجلسة الجديدة إلا على ثلاث طرق: مُنشئ الفئة حيث نقوم بإعداد كل ما هو مطلوب وطرق إعادة التعيين والتتبع والإيقاف المؤقت.

يتعرف التطبيق على أربعة أنواع فريدة من عقد SCN:

  • KnifeNode - يمثل كائنًا ثلاثي الأبعاد للسكين ، ويحمل تلقائيًا سكينًا ثلاثي الأبعاد باعتباره شكله الهندسي.
  • BulletsNode - تمثل هذه العقدة مجموعة من قذائف البندقية. يتم إعداد الضوضاء والألوان ووضع الإضاءة المادية العشوائية تلقائيًا.

    لا يلزم عمل خاص أو إضافي في الفئات التي تستخدم KnifeNode أو BulletsNode ، ويمكن استخدامها كقوالب لتخصيص التطبيق لإضافة المزيد من أنواع الكائنات ثلاثية الأبعاد.

  • ReticleNode - لف نموذج ثلاثي الأبعاد يظهر في المشهد فوق الأرض لإظهار مكان إضافة السكاكين أو الرصاص.
  • DirectionalLightNode - هذه عقدة تمثل ضوءًا عموديًا يتجه لأسفل.

المراجع والاعتمادات

نموذج السكين: https://poly.google.com/view/3TnnfzKfHrq

التسجيل من SCNScene: https://github.com/svtek/SceneKitVideoRecorder

رموز الأزرار ، تطبيق ARKit التجريبي: https://developer.apple.com/documentation/arkit/handling_3d_interaction_and_ui_controls_in_augmented_reality