ARKit Demo: การสร้างภาพยนตร์เสมือนจริง
เผยแพร่แล้ว: 2022-03-11AR และ VR กำลังกลายเป็นกระแสหลัก และบริษัทไฮเทครายใหญ่ทั้งหมดกำลังไล่ตามพวกเขา: Apple มี ARKit, Google มี ARCore และ Microsoft มี HoloLens ของตัวเอง (และแน่นอนว่ามี Unity) และด้วยแอปพลิเคชั่นบางตัวที่ได้รับความสนใจจากสาธารณชนเป็นจำนวนมาก การพัฒนาแอพ Augmented Reality จึงกลายเป็นทักษะที่นักพัฒนามือถือต้องการอย่างมาก
ในบทความนี้ ฉันต้องการแสดงแอปเล็กๆ ที่เรียบง่ายแต่มีความหมายซึ่งจะทำมากกว่าแค่ลูกบาศก์ที่หมุนได้ ใครต้องการลูกบาศก์หมุนอยู่แล้ว? มาสร้างเดอะเมทริกซ์กันเถอะ
ข้อมูลเบื้องต้นเกี่ยวกับ ARKit
ARKit เป็นเฟรมเวิร์กของ Apple สำหรับสร้างแอป AR สำหรับอุปกรณ์ iOS สามารถใช้ตัวแสดงภาพได้หลายตัว: SpriteKit สำหรับวัตถุ 2D, SceneKit สำหรับ 3D และ Metal หากเราต้องการใช้ตัวแสดงภาพแบบกำหนดเอง
สำหรับการสาธิตนี้ เราจะใช้ SceneKit ในการเรนเดอร์และวางวัตถุ 3 มิติ (มีด) ที่แสดงผลอย่างสมบูรณ์
จาก ARKit v2 รองรับการกำหนดค่าห้าประเภทใน ARKit:
AROrientationTrackingConfiguration – เมื่อคุณต้องการติดตามเฉพาะการวางแนวของอุปกรณ์ (เช่น สำหรับแอปพลิเคชันกลุ่มดาว) ด้วยการกำหนดค่านี้ การเคลื่อนไหวทางกายภาพ เช่น การเหยียบด้านข้างจะไม่ถูกติดตาม และจะไม่ส่งผลต่อตำแหน่งหรือทิศทางของวัตถุในฉาก
ARWorldTrackingConfiguration – นี่อาจเป็นการกำหนดค่าที่ใช้บ่อยที่สุดสำหรับ AR เนื่องจากรองรับสิ่งที่คนส่วนใหญ่คิดว่าเป็นเทคโนโลยีความจริงเสริม ตัวอย่าง ได้แก่ แอปพลิเคชันสัตว์เลี้ยงเสมือนจริงหรือเกมล่าโปเกมอน
ARFaceTrackingConfiguration – การกำหนดค่านี้ได้รับการสนับสนุนโดย iPhone X เท่านั้นในขณะนี้เนื่องจากต้องใช้กล้อง TrueDepth (เช่น Face ID) การกำหนดค่านี้จะติดตามคุณลักษณะบนใบหน้าและการชดเชยที่สัมพันธ์กันจากการแสดงออกทางสีหน้าที่เป็นกลาง (เช่น แอปพลิเคชันที่ผู้ใช้สามารถลองใช้แว่นกันแดดแฟชั่นก่อนสั่งซื้อ)
ARImageTrackingConfiguration – หากคุณมีชุดเครื่องหมายและต้องการแสดงสัตว์กระโดดออกจากเครื่องหมาย การกำหนดค่านี้เหมาะสำหรับคุณ สิ่งเหล่านี้ไม่จำเป็นต้องเป็นเครื่องหมายเหมือนการ์ด แต่เป็นรูปภาพ 2 มิติใดๆ คุณสามารถหันกล้องของคุณไปที่ภาพโมนาลิซ่า และเธอจะหันศีรษะและบอกคุณบางอย่าง ข้อเสียคือคุณต้องพูดล่วงหน้าว่าขนาดจริงของเครื่องหมายรูปภาพคืออะไร
ARObjectScanningConfiguration – การกำหนดค่านี้เป็น ARImageTrackingConfiguration เวอร์ชัน 3 มิติ
ในการสาธิตนี้ เราจะเพิ่มมีดและกระสุนเข้าไปในฉาก และเราอยากได้อิสระหกองศา ดังนั้นเครื่องมือที่เหมาะสมคือ ARWorldTrackingConfiguration
แนวคิดของแอพ
ทุกคนที่ได้เห็นเดอะเมทริกซ์สามารถระลึกถึงนีโอ (คีอานู รีฟส์) ที่หลบกระสุนและหยุดพวกมันไว้กลางอากาศ แอปพลิเคชันของเราจะช่วยเราสร้างฉากนี้ขึ้นมาใหม่จากฟีดกล้องถ่ายทอดสด ดังนั้นเราจึงสามารถสร้างวิดีโอที่กำหนดเองซึ่งแสดงให้เห็นถึงพลังที่เหมือนนีโอ
แอพของเราจะมีโมเดล 3 มิติของกระสุนและมีด ขึ้นอยู่กับผู้ใช้ว่าต้องการกระสุนหรือมีดกี่เล่มในภาพยนตร์ หากคุณต้องการใช้เวลาและเพิ่มรุ่นอื่นๆ โค้ดของแอปนั้นเป็นแบบโอเพนซอร์สและมีอยู่ใน GitHub (https://github.com/altaibayar/toptal_ar_video_maker) แม้ว่านี่จะไม่ใช่บทช่วยสอน AR แบบเต็ม แต่การสาธิตและแหล่งที่มาควรเป็นทรัพยากรที่มีค่า หากคุณกำลังพยายามเข้าสู่การพัฒนาแอป AR บน iOS
สถานการณ์จำลองกรณีการใช้งานที่ตั้งใจไว้มีดังนี้:
- ให้เพื่อนแต่งตัวเป็น Neo (ไม่จำเป็นสำหรับการทำงานของแอพพลิเคชั่นอย่างเคร่งครัด แต่อาจดูดีในขณะที่เราทำสิ่งนี้)
- ขอให้ "นีโอ" ยืนห่างจากคุณประมาณ 10 เมตร (30 ฟุต)
- เริ่มแอปพลิเคชันและสแกนระนาบพื้น
- เพิ่มกระสุนและมีดที่บินไปที่ "นีโอ"
- กดปุ่มบันทึกค้างไว้เพื่อบันทึกวิดีโอในขณะที่ “นีโอ” ทำท่าเจ๋งๆ เพื่อหลบหรือหยุดกระสุน
- ปล่อยปุ่มบันทึกและบันทึกวิดีโอลงในห้องสมุดของคุณ
การสร้างแอพ
ดังที่ได้กล่าวไว้ก่อนหน้านี้ เราต้องการที่จะเคลื่อนไหวได้อย่างอิสระในขณะที่บันทึกภาพทั้ง 360 ฉาก และให้กระสุนและมีดติดตามการเคลื่อนไหวของกล้องอย่างเหมาะสม

เพื่อจุดประสงค์ในการสาธิต เราจะมีวัตถุเสมือนเพียงสองประเภทเท่านั้น: มีดและกระสุนปืนลูกซอง
มีดเป็นวัตถุที่มีรายละเอียดและฉันจะใช้โมเดลฟรีจาก https://poly.google.com/view/3TnnfzKfHrq (ขอบคุณ Andrew)
อย่างไรก็ตาม กระสุนปืนลูกซองเป็นวัตถุทรงกลมธรรมดา และเราสามารถเขียนโค้ดได้ง่ายๆ เราจะทำให้มันเป็นโลหะและสีแดงเพื่อความหลากหลาย เนื่องจากเรากำลังจำลองปืนลูกซอง เราจึงสร้างพวกมันเป็นกลุ่มที่มีการจัดกลุ่ม เพื่อให้การจัดกลุ่มมีความสมเหตุสมผลโดยไม่ต้องยุ่งยากมากเกินไป เราสามารถใช้ตัวสร้างตัวเลขสุ่มแบบเกาส์เซียนจาก GamplayKit
GameplayKit เป็นเครื่องมือที่มีประโยชน์ซึ่งสะดวกทุกเมื่อที่คุณต้องการสร้างเสียงรบกวนแบบสุ่ม ระบุเครื่องจักร AI หรือการตัดสินใจตามความน่าจะเป็น
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 และคลาสเซสชันใหม่มีเพียงสามวิธีเท่านั้น: ตัวสร้างคลาสที่เราตั้งค่าทุกอย่างที่จำเป็น และวิธีการ resetTracking และ pauseTracking
แอปพลิเคชันรู้จัก SCNNodes สี่ประเภทที่ไม่ซ้ำกัน:
- KnifeNode – หมายถึงวัตถุ 3D ของมีด และโหลดมีด 3D เป็นรูปทรงเรขาคณิตโดยอัตโนมัติ
BulletsNode – โหนดนี้แสดงถึงชุดของกระสุนปืนลูกซอง เสียงรบกวน สี และโหมดการจัดแสงแบบเกาส์สุ่มจะถูกตั้งค่าโดยอัตโนมัติ
ไม่จำเป็นต้องมีงานพิเศษหรืองานเพิ่มเติมในชั้นเรียนที่ใช้ KnifeNode หรือ BulletsNode และสามารถใช้เป็นเทมเพลตสำหรับปรับแต่งแอปพลิเคชันเพื่อเพิ่มวัตถุ 3D ประเภทต่างๆ ได้มากขึ้น
- ReticleNode – ล้อมโมเดล 3 มิติซึ่งปรากฏในฉากเหนือพื้นเพื่อแสดงตำแหน่งที่มีดหรือกระสุนจะถูกเพิ่ม
- 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