ARKitデモ:拡張現実映画制作
公開: 2022-03-11ARとVRが主流になりつつあり、すべての主要なハイテク企業がそれらを追求しています。AppleにはARKitがあり、GoogleにはARCoreがあり、Microsoftには独自のHoloLensがあります(もちろん、Unityもあります)。 また、いくつかのアプリケーションが多くの注目を集めているため、拡張現実アプリの開発はモバイル開発者にとって非常に望ましいスキルになりつつあります。
この記事では、単純に回転する立方体以上の機能を備えた、シンプルでありながら意味のある小さなアプリを紹介します。 とにかく回転する立方体が必要なのは誰ですか? マトリックスを作りましょう。
ARKitの紹介
ARKitは、iOSデバイス用のARアプリを作成するためのAppleフレームワークです。 2Dオブジェクト用のSpriteKit、3D用のSceneKit、カスタムレンダラーを実装する場合はMetalなど、いくつかのレンダラーを使用できます。
このデモでは、SceneKitを使用して、完全にレンダリングされた3Dオブジェクト(ナイフ)をレンダリングおよび配置します。
ARKit v2から、5種類の構成がARKitでサポートされます。
AROrientationTrackingConfiguration –デバイスの向きのみを追跡する場合(たとえば、星座アプリケーションの場合)。 この構成では、サイドステッピングなどの物理的な動きは追跡されず、シーン上のオブジェクトの位置や方向に影響を与えません。
ARWorldTrackingConfiguration –これは、ほとんどの人が拡張現実と見なすものをサポートするため、おそらくARで最も頻繁に使用される構成です。 例としては、仮想ペットやポケモンの狩猟アプリケーションがあります。
ARFaceTrackingConfiguration –この構成はTrueDepthカメラ(Face IDなど)を必要とするため、現在iPhoneXでのみサポートされています。 この構成は、顔の特徴とニュートラルな表情からの相対的なオフセットを追跡します(たとえば、ユーザーが注文する前にファッションサングラスを試すことができるアプリケーション)。
ARImageTrackingConfiguration –マーカーのセットがあり、動物がマーカーから飛び出すのを表示したい場合は、この構成が適しています。 これらはカードのようなマーカーである必要はありませんが、2D画像である必要があります。 カメラをモナリザに向けると、彼女は頭を向けて何かを教えてくれます。 欠点は、画像マーカーの物理的なサイズを事前に言わなければならないことです。
ARObjectScanningConfiguration –この構成はARImageTrackingConfigurationの3Dバージョンです。
このデモでは、シーンにナイフと弾丸を追加します。6自由度が必要なので、適切なツールはARWorldTrackingConfigurationです。
アプリのコンセプト
マトリックスを見た人なら誰でも、ネオ(キアヌ・リーブス)が弾丸をかわして空中で止めたことを思い出すことができます。 このアプリケーションは、ライブカメラフィードからこのシーンを再現するのに役立ちます。 したがって、Neoのような力を示すカスタムビデオを作成できます。
私たちのアプリには、弾丸とナイフの3Dモデルが含まれます。 映画に必要な弾丸やナイフの数はユーザー次第です。 時間をかけて他のモデルを追加したい場合は、アプリコードがオープンソースであり、GitHub(https://github.com/altaibayar/toptal_ar_video_maker)で入手できます。 これは完全なARチュートリアルではありませんが、iOSでARアプリの開発に取り掛かろうとしている場合は、デモとソースが貴重なリソースになるはずです。
使用目的のシナリオは次のとおりです。
- 友達にNeoの格好をしてもらいます(アプリケーションの機能に厳密に必要というわけではありませんが、これを実行している間は見栄えがよいかもしれません)。
- 「ネオ」にあなたから約10メートル(30フィート)のところに立つように頼みます。
- アプリケーションを起動し、グランドプレーンをスキャンします。
- 「ネオ」で飛んでいる弾丸とナイフを追加します。
- 「Neo」が弾丸をかわしたり止めたりするクールな動きを実行している間、録画ボタンを押したままにしてビデオを録画します
- 録画ボタンを放し、ビデオをライブラリに保存します。
アプリの構築
前述のように、シーンの360度すべてを記録しながら自由に移動できるようにし、弾丸とナイフでカメラの動きを適切に追跡できるようにする必要があります。
デモンストレーションの目的で、仮想オブジェクトにはナイフとショットガンの弾丸の2種類しかありません。
ナイフは詳細なオブジェクトであり、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プロジェクトを回避するためのガイドとして、プロジェクトの構造をレイアウトします。主要なコンポーネントとは何か、それらがどのように接続されているか、なぜそれらが選択されたのかです。
アプリケーションには3つの画面しかありません。
PermissionViewController –必要なモバイル機能へのアクセスをアプリケーションに許可するようにユーザーに求める画面。
- カメラ–明らかに
- ギャラリー–録画したビデオとマイク入力を保存します
- マイク–ビデオの作成に使用しているライブラリには許可が必要です(デフォルトでは、マイクからのサウンドがオーディオトラックのソースとして使用されます)。
ExportViewController –この画面には、録画されたビデオが表示され、ビデオを共有または保存するためのオプションが提供されます。
MainViewController –すべての魔法はここで起こります。
私の経験から、ARSession、ARConfiguration、およびすべての一意のタイプのSCNNodeなどの必要なすべてのARKitクラスをラップするのが最善です。 そうすれば、コードは自明です。
ARSessionはToptalARSessionに継承され、新しいセッションクラスには3つのメソッドしかありません。必要なものすべてをセットアップするクラスコンストラクターと、resetTrackingおよびpauseTrackingメソッドです。
アプリケーションは、4つの固有のタイプのSCNNodeを認識します。
- KnifeNode –ナイフの3Dオブジェクトを表し、そのジオメトリとして3Dナイフを自動的にロードします。
BulletsNode –このノードはショットガンシェルのセットを表します。 ランダムガウスノイズ、色、および物理的な照明モードが自動的に設定されます。
KnifeNodeまたはBulletsNodeを使用するクラスでは、特別な作業や追加の作業は必要ありません。これらは、アプリケーションをカスタマイズしてより多くの種類の3Dオブジェクトを追加するためのテンプレートとして使用できます。
- ReticleNode –床の上のシーンに表示される3Dモデルをラップして、ナイフまたは弾丸が追加される場所を示します。
- 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