ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
iOS、macOS、visionOS向けRealityKit APIの紹介
RealityKitの新しいクロスプラットフォームAPIを使用し、iOS、macOS、visionOS向けのイマーシブなアプリを構築する方法を説明します。ホバーエフェクト、光と影、ポータルクロッシングなどの新機能を取り上げ、実際のアプリでの利用例をご紹介します。
関連する章
- 0:00 - Introduction
- 2:44 - Hover effects and input
- 9:05 - Force effects and joints
- 17:42 - Dynamic lights
- 20:17 - Portal enhancements
- 25:29 - Cross-platform capabilities
リソース
関連ビデオ
WWDC24
- Reality Composer Proにおけるインタラクティブな3Dコンテンツの作成
- RealityKitによる空間描画アプリの構築
- RealityKitオーディオで空間コンピューティングアプリの質を向上
WWDC23
WWDC21
-
ダウンロード
こんにちは Yidiです RealityKitチームのエンジニアです このセッションでは 空間コンピューティングアプリの開発に役立つ 新しいRealityKit APIをご紹介します
RealityKitは 高性能な 3Dシミュレーションとレンダリング機能を iOS iPadOS macOS visionOSの アプリに提供するフレームワークです 3Dコンテンツを現実世界に シームレスに融合させ 空間コンピューティング向けのイマーシブな アプリやゲームを開発するための 様々な機能が用意されています Apple Vision Proのリリース以来 多くの方々から素晴らしいフィードバックを いただいています 有益な提案や機能のご要望を お寄せいただいた皆様に 心から感謝いたします うれしいことに そうしたフィードバックの多くが RealityKitに新機能として導入されました このセッションでは 一部の機能を使用して 宇宙船ゲームを作成していきます リンク先のサンプルプロジェクトを ダウンロードしてご確認ください このゲームは お気に入りの宇宙船で遊ぶ 子どもの感覚を再現しています ゲームは格納庫から始まります ここはプレイヤーが 宇宙船を間近で点検できる安全な場所です 次に 物理的な環境で 両手を使って 宇宙船を操縦する方法を覚えます 操縦に慣れたら 宇宙空間に飛び出し 小惑星をかわしながら 大切な宇宙貨物を運びましょう ポータルを通り抜けて 遠い惑星までワープすることもできます このゲームを構築しながら 新しいRealityKit APIを見ていきましょう まず ホバーエフェクトを使用して 3Dモデルを操作し ハンドトラッキングを使用して 中核となる入力メカニズムを構築します 次に フォースエフェクトとジョイントを使用し 物理的なシミュレーションをゲームに追加します その後 シーンを照らす ダイナミックライトを追加し 影を使用して プレイヤーが 距離を感じられるようにします さらに ポータルAPIを使用して 遥か遠い宇宙空間への入り口を開き 機能強化された新しいポータルを活用して 宇宙へ飛び立ちます
最後に RealityKitの クロスプラットフォーム機能を紹介します 他のAppleプラットフォームへ ゲームを簡単に移行できます 最後まで エキサイティングな旅を お楽しみください さっそく始めましょう
最初は ホバーエフェクトと入力です visionOSでは アプリのコンテンツを ウインドウ ボリューム スペースに表示できます ここではまず ボリュームスタイルを使用して 格納庫に収められた宇宙船を表示します
プレイヤーはシンプルな ドラッグジェスチャで宇宙船を回転させ 綿密に点検することができます このボリュームのベースプレートも提供され プレイヤーが視線を向けている場所が 視覚的に示されます お気づきかもしれませんが ベースプレートと異なり 宇宙船に視線を向けているときは 視覚的なハイライトが表示されません 宇宙船にHoverEffectComponentを追加して プレイヤーが宇宙船に視線を向けた時 自然なスポットライトが 当たるようにしましょう これで操作の応答性を 高めることができます では ゲームのアートスタイルに合わせて ホバーエフェクトをカスタマイズするには? 皆さんに朗報があります 今年 ホバーエフェクトを カスタマイズするための新しいAPIが RealityKitに導入されました 先ほどのデフォルトの スポットライト効果に加えて 新しい2つのスタイルを使用できます ハイライトとシェーダです 新しいハイライトスタイルは メッシュ全体を均一にハイライトします スポットライトまたは ハイライトのスタイルを使用する場合 色合いをカスタマイズすることもできます 新しいシェーダスタイルは シェーダグラフマテリアルと統合することで 可能性がさらに広がります ハイライト効果を追加し 宇宙船の外観に合わせて 色合いを変えてみましょう 色の濃さも調整して 違和感なく表示されるようにします そのためには HighlightHoverEffectStyleを作成し 色合いをアーティストが定義した黄色 色の濃さを0.8に設定します 次に このスタイルを使用して HoverEffectComponentを作成し それをspaceshipエンティティに追加します 新しいハイライトホバーエフェクトを エンティティに追加する方法はシンプルです
スポットライトとハイライトによる 新しいカスタマイズ機能を使用すると ホバーエフェクトをすばやく簡単に 3Dコンテンツに追加できます 一方 新しいシェーダスタイルは さらにパワフルで柔軟です Reality Composer Proで シェーダグラフマテリアルを使用して 高度な視覚効果を作成できます 私はこの機能を使用して カスタムのホバーエフェクトを追加し 視線を向けたとき 宇宙船の窓が ハイライトされるようにしました 希望通りになりました 宇宙船モデルともぴったり合っています この効果を実現するため シェーダグラフで 新しいHoverStateノードを使用しました HoverStateノードには複数の入力があります 例えばIntensity値は プレイヤーが宇宙船に視線を向けた時 0から1までアニメーション化されます 宇宙船の窓には すでに Reality Composer Proで設定された シェーダグラフマテリアルがあります これにHoverStateノードを追加し Intensity値をMixノードに 指定しました これでプレイヤーが視線を向けたときに 宇宙船のエミッシブカラーがフェードインします 最後に Mixノードの出力を PBRSurfaceのエミッシブカラーに渡します
コードでは デフォルトの入力を使用して ホバースタイルをシェーダに 更新するだけです HoverStateノードでは 様々な効果を実現できます 例えば 同僚のAdrianは 空間描画アプリを開発し シェーダスタイルのホバー効果を使用して 3Dブラシのストロークを 紫色の光でなぞる アニメーションを適用しました このサンプルの詳細については 今年のWWDCのセッション 「Build a spatial drawing app with RealityKit」をご覧ください HoverEffectComponentは 3Dエンティティに視線が向けられたとき 視覚的なフィードバックを返す 効果的な方法を提供し これらすべてをユーザーのプライバシーを 侵害することなく実現します 今年は SwiftUIにもカスタムの ホバーエフェクトAPIが導入されます 詳しくは 「Create custom hover effects in visionOS」セッションをご覧ください
次に このゲームの 入力メカニズムを定義しましょう
宇宙船で飛び回る 準備ができたプレイヤーは ボリュームを飛び出して 複雑なイマーシブ空間に入ります
ここでは 両手を使って宇宙船を操作します 左手は宇宙船の飛行速度を制御します 親指と人差し指を近づけると 飛行速度が増します 右手は宇宙船の向きを制御します 右手を上に傾けると 宇宙船も上向きになります 右手を左に向けると 宇宙船も左に曲がります
この入力方法を実装するには プレイヤーの 両手を3D空間で追跡する必要があります visionOS 1では ARKitを使用して アプリにカスタムハンドトラッキングを 追加することができました 今年は RealityKitに新しい Spatial Tracking APIが導入されたので このタスクをさらに簡単に行えます
SpatialTrackingSessionはプレイヤーから ハンドトラッキングの同意を得るのに役立ちます これを設定すれば RealityKitの アンカーエンティティを使用して プレイヤーの両手を追跡できます 左手については 2つのアンカーエンティティを作成します 人差し指の先と親指の先です
カスタムシステムのupdate関数内で これらのアンカーエンティティの位置を Entity.position APIを使用して照会します 2つのアンカーエンティティ間の 距離を計算した後 カスタム関数を使用して その距離をスロットル値にマッピングします 距離が短いほど スロットルが大きくなります 最後に このスロットル値に基づいて 宇宙船を加速します 宇宙船の進行方向の力ベクトルを計算し その力をspaceshipエンティティに追加します 右手の制御についても 同様のコードで 実装できます このセッションに リンクされているサンプルコードをご覧ください
右手と左手両方の カスタムジェスチャを実装したので プレイヤーは自分の手を使って 宇宙船を飛ばすことができます
素晴らしいですね! SpatialTrackingSession APIの詳細は Adrianのセッション 「Build a spatial drawing app with RealityKit」をご覧ください これでプレイヤーは自分で操縦できる 宇宙船を手に入れました このパイロット体験を もっと面白いものにしましょう ここでは 新しいフォースエフェクトと 物理ジョイントのAPIについて説明します プレイヤーが操縦スキルを 磨けるようにするため 宇宙空間に惑星と小惑星を追加しました しかし 静止した物体を避けながら 飛行するのは それほど難しくありません 小惑星が惑星の周りを 周回するようにしてみましょう これは現実世界の天体の動きを 模倣しています フォースエフェクトAPIは このような シミュレーションを導入する際に役立ちます フォースエフェクトはボリュームを定義し そのボリューム内の物体に 継続的に力を加えます この惑星の場合 周囲の小惑星を 中心に引き寄せる フォースエフェクトが必要です
RealityKitには4種類の フォースエフェクトが組み込まれています どれがニーズに合うか見てみましょう Constant radialエフェクトは すべての物体に対して 一定の力を中心に向かって加えます vortexエフェクトは 軸を中心に物体を周回させる力を加えます Dragエフェクトは それぞれの速度に比例する力を加え ボリューム内で物体を減速させます Turbulenceエフェクトは 物体にランダムな力を加えます 私たちのニーズに最も近いのは Constant radialエフェクトですが 惑星がすべての小惑星に まったく同じ大きさの力を 加えるのではなく 惑星からの距離に応じて 加える力の大きさを変える必要があります RealityKitでカスタムのフォースエフェクトを 定義すれば これを実現できます
ここではGravityというクラスを定義し ここにカスタムフォースエフェクトのロジックを 記述していきます カスタムフォースエフェクトはすべて ForceEffectProtocolに準拠します これには3つの要件があります parameterTypes、forceMode update関数です
ParameterTypesは このフォースエフェクトの 計算するために必要なパラメータを 物理エンジンに伝えるのに役立ちます 重力エフェクトでは 位置と距離が必要になります forceModeは このエフェクトで生じる 力ベクトルを物理エンジンがどのように 解釈するかを制御します 重力の場合 単にforceに設定します
最後に update関数では 実際の力ベクトルを計算します parameters構造体は 力の計算に 必要な情報を提供します
まず この構造体から 距離と位置を取得します 次に このフォースエフェクトの 影響を受けるすべての物理ボディを ループ処理します ここでは 惑星の周りを公転する小惑星です 指定された距離と位置の値を 使用して力ベクトルを計算する カスタム関数を定義します parameters構造体に力を設定して その結果を出力します 物理エンジンはこの力を 物理ボディに適用します これでカスタムフォースエフェクトを 作成できました 次に シーンでこれをアクティブにしましょう
まず Gravityのインスタンスを使用して ForceEffectオブジェクトを作成します ここでは spatialFalloffを設定して 惑星から半径8m以内の物理ボディにのみ 影響が及ぶようにします さらに 小惑星にのみ影響するように マスクを設定します
最後に ForceEffectComponentを使用して 重力フォースエフェクトを planetエンティティに追加します
重力エフェクトの動きを見てみましょう
重力エフェクトは 間違いなく作用していますが 小惑星を公転運動させるのではなく 中心に向かって直線的に引き寄せています これを修正するには 小惑星が軌道を描いて回るように 初速度を与える必要があります 惑星の重力によって 小惑星はその方向に引き寄せられます 惑星の引力を相殺する速度を設定すれば 軌道運動を実現できます
小惑星を生成する時の 軌道速度を計算してみましょう 惑星から小惑星までの 半径と角度を使用すれば 初速度を計算できます 次に PhysicsMotionComponentを使用して この初速度を小惑星に設定します どうなるか見てみましょう
いいですね 小惑星が惑星の周りを 公転するようになりました パワフルなフォースエフェクトAPIにより カスタムフォームエフェクトを 1つ利用するだけで この軌道運動を実現できました これで挑戦しがいのある 小惑星障害物コースを作成できました 次は 宇宙船の後ろに トレーラーを追加して プレイヤーがコースを飛行しながらが 宇宙貨物を運べるようにしましょう
宇宙船にトレーラーを追加する 最も簡単な方法は trailerエンティティを 宇宙船の子にすることです ただしこの場合 宇宙船とトレーラーの接続に 柔軟性がなくなります 物理ジョイントを使用すれば この接続に遊び心を加えることができます ジョイントは2つの物理ボディを 拘束によって結合します
回転は可能だが 並進運動を制限する ジョイントを作成しましょう これは現実世界の トレーラーの動きと同じです このジョイントを使用すれば トレーラーの けん引をよりリアルで愉快に表現できます
ジョイントを作成するには エンティティに ピンを追加する必要があります ピンは エンティティを基準に 位置と方向を定義します 1つのジョイントは2つのピンを つなぎ合わせます これらのピンは それぞれ宇宙船の後部と トレーラーの前部にあります
ここで必要なのは2つのピン間の並進運動を 0に制限するジョイントです さらに 3本の軸を中心に回転する 余裕も残しておく必要があります
フォースエフェクトと同様 RealityKitには いくつかのジョイントが組み込まれています 制約がない場合 ジョイントの2番目のエンティティは 3本のどの軸についても自由に 並進または回転することができます 組み込みのジョイントは 2番目のエンティティの 並進運動または回転運動に 拘束を適用します 詳しく見てみましょう
固定ジョイントでは 並進も回転もできません 球面ジョイントの場合 並進は不可能ですが Y軸とZ軸を中心に限定的に回転でき X軸を中心に自由に回転できます
回転ジョイントは球面ジョイントと 似ていますが 動きがより制限され X軸を中心にのみ回転できます 直進ジョイントは スライドジョイントとも呼ばれ X軸に沿った並進運動のみが可能になります またディスタンスジョイントの場合 3本すべての軸での自由な動きが可能ですが 2つの物体間の距離が 所定の範囲内であることが条件となります
宇宙船とトレーラーの条件を 最も満たしているのは球面ジョイントです 唯一の違いは X軸を中心とする回転を まったく制限しないことです カスタムジョイントタイプを使用すれば このニーズを満たすことができます
その方法を見ていきましょう Reality Composer Proで宇宙船に Hookエンティティを追加しました これによってピンの配置が定義されるので 変形をハードコードする必要がありません コードにhookEntityが追加されています 宇宙船を基準とする hookEntityの位置を取得します
次に pins.set APIを使用して spaceshipエンティティに hookPinを作成します その際 ピンの位置として fookOffsetを使用します トレーラーのピンについても 同じことを行います
次に 2つのピンを接続する カスタムジョイントを作成しましょう
カスタムジョイントにより 3本すべての軸を中心とする円運動を 個別に拘束できます 円運動が狭い範囲で 拘束されるように設定します X軸を中心とする円運動をさらに制限して トレーラーが上下に 回転しすぎないようにします
回転運動と同様 3本の軸に沿った 直線運動も個別に制御できます 並進運動は不要なので 3本すべての軸に沿った直線運動を 固定として設定します
最後に このジョイントを有効にするため 物理シミュレーションに追加します
カスタム物理ジョイントを使用することで 宇宙船にけん引されるトレーラーが 物理法則に従うようになりました いいですね! 次は 宇宙船にヘッドライトを追加して プレイヤーの操縦体験を向上させましょう ヘッドライトは 近くの物を照らすだけでなく 影もキャストします そのためプレイヤーは 障害物までの距離を 簡単に確認できるようになります これを実現するには ダイナミックライトと影を使用します これらは 今年visionOSに 導入された機能です RealityKitには 3種類のライトが用意されています スポットライトは円すい形の光で オブジェクトを照らします 角度 距離 減衰量をカスタマイズできます ディレクショナルライトはシーン内の すべてのオブジェクトを照らします ポイントライトは 複数のオブジェクトを照らします
減衰半径とフォールオフ指数を カスタマイズできます
これら3種類のライトはすべて 色と強度をカスタマイズできます ただし影をキャストできるのはスポットライトと ディレクショナルライトのみです ライトと影のレンダリングは負荷が高いため これらを取り入れる時は アプリのパフォーマンスを 頻繁にチェックすることをお勧めします
宇宙船の前面に スポットライトを取り付けましょう 強力なヘッドライトがあれば 宇宙船の近くにあるオブジェクトを 見分けることができます ライトと影を追加するには 2つの方法があります コードでSwift APIを使用するか またはReality Composer ProのUIで ライティングの動作を調整します Swiftコードで追加する方法を 見ていきましょう Reality Composer Proで 宇宙船のフックのエンティティを 設定したときと同様 新しいheadlightエンティティを追加して ライトの変形を定義します コードでは このheadlightエンティティは spaceshipエンティティ階層にあります これにスポットライトをアタッチします
スポットライトは黄色に設定されています 強度を10000ルーメンに設定し 減衰半径を6に設定します このシーンではこれらの値が適しています
このスポットライトでは影をキャストしたいので Shadowコンポーネントを作成して このエンティティに追加します
結果を見てみましょう ヘッドライトと影により 宇宙船が小惑星に近づきすぎているときは すぐにわかるようになりました
ダイナミックスポットライトと ディレクショナルライトで照らされる すべてのオブジェクトは デフォルトで影をキャストします 影をキャストしたくない オブジェクトがある場合は そのオブジェクトに DynamicLightShadowComponentを追加し castsShadowを「false」に設定します このビデオでは小惑星の castsShadowが無効になっています このゲームをプレイするのが 楽しみになってきました 宇宙船をはるか遠い宇宙空間へ ワープさせるポータルを追加すれば さらに魅力が増すはずです ポータルAPIを使用してこれを実装しましょう このAPIには 新しい多数のエキサイティングな 機能強化が追加されています これも皆さんのフィードバックのおかげです ポータルはメッシュサーフェスを使用して 別世界へ通じる窓を開きます この世界のすべてのエンティティは ポータルジオメトリによってマスクされます 惑星を取り囲む小惑星は 円形ポータルサーフェスの 内側でのみレンダリング されていることがわかります
ポータルの構築方法について詳しくは WWDC23のセッション「Enhance your spatial computing app with RealityKit」を ご覧ください visionOS 1では オブジェクトはポータルの 完全に内側または完全に外側に配置されます このRealityKitリリースでは ポータルクロッシング機能が追加され オブジェクトがポータルサーフェスを スムーズに横断して ポータルに入ったり ポータルから出たり できるようになりました このビデオの2台の宇宙船のうち 左側はポータルクロッシングが無効なため ポータルから出るとマスクされます 右側の飛行船は ポータルクロッシングが有効なので ポータルからスムーズに 飛び出すことができます ポータルクロッシングを有効にするには 2か所で設定する必要があります まず portalコンポーネントの作成時に クロッシングモードを設定します このモードをplaneに設定して クロッシングを有効にするか またはdisabledに設定して クロッシングを無効にします 平面を使用する場合は ポータルジオメトリ自体と一致させます このゲームでは ポータルと 一致する平面は正のZ平面です ポータルクロッシングに加え ポータルのクリッピング平面も 定義できるようになりました これも正のZ平面に設定します
もう1つの設定項目は spaceshipエンティティに関してです ポータル世界のエンティティは デフォルトで ポータルクロッシングが有効になりません 宇宙船でこの機能を有効にするため PortalCrossingComponentを追加します これで宇宙船がポータルに 飛び込めるようになりました
宇宙船がポータルを通過するとき 1つ気になる点があります ポータルクロッシング平面での 宇宙船のライティングが 少し不自然なようです 宇宙船の翼のところです
強烈な光の遮断は ポータル内外の 様々な照明環境によって発生します ポータルクロッシングが有効なモデルの場合 ポータル内では カスタムのImageBasedLightComponentに よって照らされます 例としてstar fieldの 画像を使いましょう
モデルがポータルの外側にある場合 物理的な環境の照明に近い 環境プローブからの照明も受けます
オブジェクトがポータルを通過するときは ポータルの内部と外部が 同時に存在することになります 内部は ポータルの ImageBasedLightComponentから star fieldによって照らされます ポータルの外部は 2つの光源の 組み合わせによって照らされます star fieldと環境プローブです
ライティングをよりスムーズに 変化させるため EnvironmentLightingConfigurationComponent を使用できます このコンポーネントでは ポータルの外側の部分について エンティティが 環境プローブから受け取る照明の量を environmentLightingWeight値で 制御します 値1の場合 環境プローブの フル照明がオブジェクトに適用され 値0の場合は 環境プローブの 照明がまったく適用されません 宇宙船がポータルの外側にある時 environmentLightingWeightを1に設定すると 外部の照明を受けることができます 宇宙船がポータルに近づくにつれて この値を1から0に徐々に小さくし 宇宙船がポータルを通過する時 ポータル世界の内側からのみ 光を受けるようにします これをコードで実現するには EnvironmentLightingConfigurationComponent を作成します ポータルサーフェスから 宇宙船までの距離を追跡し カスタム関数を使用して その距離値を 環境照明の重み値にマッピングします 距離が縮まり 宇宙船がポータルに近づくほど 重み値が小さくなります 宇宙船が移動するたびに重みを再計算し spaceshipエンティティのコンポーネントを 更新する必要があります このコードを実行してみましょう
素晴らしい! 宇宙船がポータルサーフェスに近づく時 船体に当たる照明が スムーズに変化しています EnvironmentLightingConfigurationComponentは アプリのライティングを 設定するためのパワフルな方法です アプリでポータルを 使用しない場合でも役立ちます
新しいポータルの 機能強化について詳しくは developer.apple.com/jpで PortalComponentに関するドキュメントを ぜひご覧ください
素晴らしい! これで visionOSで動作するフル機能の 宇宙船ゲームを構築できました 両手を使った入力 フォースエフェクト ジョイント ライトと影 ポータルが すべて適切に機能しています この宇宙船体験を様々なプラットフォームで 提供できたら素晴らしいと思いませんか? このリリースのRealityKitでは 開発した空間コンピューティング体験を visionOSからiOS iPadOS macOSへ シームレスに移行できるようになりました 最小限のコード変更で 他のAppleプラットフォームでも 同じ体験を提供できます Appleでは多数のRealityKit機能を 対象にこのサポートを追加し このプロセスをシームレスに 行えるようにしています これには RealityView ShaderGraph パーティクルエミッタ ポータル ホバーエフェクト テキスト などが含まれます クロスプラットフォームのツールや パイプラインを開発し アプリ開発の促進に 役立てることもできます では いくつかの クロスプラットフォーム機能を使用して 宇宙船ゲームを iPadOSに移行してみましょう 広範なクロスプラットフォームの サポートにより 宇宙船ゲームのほとんどのコードは 何も変更する必要がありません ホバーエフェクト フォースエフェクト ジョイント ライトと影 ポータルクロッシング用に記述したコードは すべてそのままで使用できます では 変更する必要があるのは?
まずvisionOSでは プレイヤーの周囲の 独立したウインドウにUIをレイアウトできます iPadOSでは UIを画面上に直接配置します 次に visionOSでは 空間体験の入力ポイントとして ImmersiveSpaceを使用します iPadOSでは RealityViewを使用して 画面上に直接 空間体験を表示できます
RealityViewはiOS iPadOS macOSで利用できます これには カメラモードの制御や 後処理などの新機能が含まれています カメラフィード付きのワールドトラッキングを バックグラウンドとして使用しましょう そのためにはRealityViewのカメラモードを ワールドトラッキングに設定します
最後に visionOSではハンドトラッキングベースの 入力を使用して宇宙船を操縦します iPadOSでは Multi-Touchジェスチャを 入力パラダイムとして使用すると このプラットフォームの強みを 活かすことができます 新しいMulti-Touchコントロールビューを使って Multi-Touchベースの入力に移行します 左側のスライダでスロットルを制御し 右側のバーチャルジョイスティックで ピッチとロールを制御します 右手と左手の役割を分けることで visionOSの入力スキームに 適切に対応させることができます これらの変更により 宇宙船ゲームを iPadで楽しめるようになります visionOSの場合と同じように ここでも RealityKitの すべての機能を利用できます 格納庫ビューを表示して 同じドラッグジェスチャで 宇宙船を操作したり ワールドトラッキングとカメラフィードを バックグラウンドとして使用し 物理的な環境で 宇宙船を飛行させたりできます 複数のプラットフォームにわたる RealityKitの機能同一性により visionOS iOS iPadOS macOSで 同じアプリを簡単に 実行させることができます
素晴らしいですね! これで 機能豊富な宇宙船ゲームを visionOSだけでなくiPadOSでも 楽しめるようになりました ここでは 宇宙船ゲームの シミュレーションとレンダリングの構築に 焦点を当てましたが まだサウンドがありません 同僚のJamesが このゲームの 空間オーディオの作成方法を説明しています 「Enhance your spatial computing app with RealityKit audio」セッションをご覧ください RealityKitのオーディオAPIの 使用方法に加え 空間オーディオの構築に関する ベストプラクティスも紹介しています このセッションでは取り上げませんでしたが RealityKitには他にも様々な機能があります その一部を簡単にご紹介します LowLevelMeshとLowLevelTextureは メッシュ/テキストリソースを構築や更新 するための低レベルのアクセスを提供します アニメーションシステムには Reality Composer Proでの アニメーションタイムラインの作成など 新たな多数の機能が用意されています BillboardComponentには プライバシー保護の方法が導入され エンティティが常にユーザーに 対面するようになりました PixelCastでは レンダリングベースのアプローチにより ピクセル単位で最適な エンティティを選択できます サブディビジョンサーフェスを使用すると 高密度のメッシュを作成しなくても 滑らかな表面をレンダリングできます これらの機能について詳しくは developer.apple.com/jpをご覧ください 沢山ありますね 本日の内容を振り返りましょう まず 宇宙船にカスタムの ホバーエフェクトを追加しました また 新しい空間トラッキングAPIを使用して ハンドジェスチャベースの 制御メカニズムを独自に構築し 飛行船を操縦できるようにしました フォースエフェクトとジョイントを使用して シーンに物理的な動きを加え より楽しいゲームにしました さらに ダイナミックライトと影を使用して より刺激的な体験を実現しました また ポータルクロッシングを導入して 宇宙船が宇宙へ飛び出せるようにしました 最後に RealityKitの クロスプラットフォームAPIを使用して 宇宙船ゲームをiPadへ移行しました 「Build a spatial drawing app with RealityKit」セッションと 「Enhance your spatial computing app with RealityKit audio」セッションで 今年 RealityKitに追加された 他の様々な新機能をご確認ください これらの機能を活用して 皆さんが素晴らしい体験を作り上げるのを 楽しみにしています ありがとうございました
-
-
4:24 - Add a highlight HoverEffectComponent
// Add a highlight HoverEffectComponent let highlightStyle = HoverEffectComponent.HighlightHoverEffectStyle(color: .lightYellow, strength: 0.8) let hoverEffect = HoverEffectComponent(.highlight(highlightStyle)) spaceship.components.set(hoverEffect)
-
5:55 - Add a shader effect
// Add a shader effect let hoverEffect = HoverEffectComponent(.shader(.default)) spaceship.components.set(hoverEffect)
-
8:04 - Control acceleration with left hand
// Control acceleration with left hand class HandTrackingSystem: System { func update(context: SceneUpdateContext) { let indexTipPosition = indexTipEntity.position(relativeTo: nil) let thumbTipPosition = thumbTipEntity.position(relativeTo: nil) let distance = distance(indexTipPosition, thumbTipPosition) let throttle = computeThrottle(with: distance) let force = spaceship.transform.forward * throttle spaceship.addForce(force, relativeTo: nil) } }
-
10:50 - Adding a gravity force effect
// Adding a gravity force effect struct Gravity: ForceEffectProtocol { var parameterTypes: PhysicsBodyParameterTypes { [.position, .distance] } var forceMode: ForceMode = .force func update(parameters: inout ForceEffectParameters) { guard let distances = parameters.distances, let positions = parameters.positions else { return } for i in 0..<parameters.physicsBodyCount { let force = computeForce(distances[i], positions[i]) parameters.setForce(force, index: i) } } }
-
12:14 - Activating the gravity force effect
// Activating the gravity force effect let gravity = ForceEffect(effect: Gravity(), spatialFalloff: SpatialForceFalloff(bounds: .sphere(radius: 8.0)), mask: .asteroids) planet.components.set(ForceEffectComponent(effects: [gravity]))
-
13:11 - Using PhysicsMotionComponent
// Calculate initial velocity of the asteroid using radius and angle let velocity = calculateVelocity(radius, angle) let physicsMotion = PhysicsMotionComponent(linearVelocity: velocity) asteroid.components.set(physicsMotion)
-
16:19 - // Add a custom joint
// Add a custom joint guard let hookEntity = spaceship.findEntity(named: "Hook") else { return } let hookOffset: SIMD3<Float> = hookEntity.position(relativeTo: spaceship) let hookPin = spaceship.pins.set(named: "Hook", position: hookOffset) let trailerPin = trailer.pins.set(named: "Trailer", position: .zero) var joint = PhysicsCustomJoint(pin0: hookPin, pin1: trailerPin) joint.angularMotionAroundX = .range(-.pi * 0.05 ... .pi * 0.05) joint.angularMotionAroundY = .range(-.pi * 0.2 ... .pi * 0.2) joint.angularMotionAroundZ = .range(-.pi * 0.2 ... .pi * 0.2) joint.linearMotionAlongX = .fixed joint.linearMotionAlongY = .fixed joint.linearMotionAlongZ = .fixed try joint.addToSimulation()
-
19:12 - // Add a spotlight with shadow
// Add a spotlight with shadow guard let lightEntity = spaceship.findEntity(named: "HeadLight") else { return } lightEntity.components.set(SpotLightComponent(color: .yellow, intensity: 10000.0, attenuationRadius: 6.0)) lightEntity.components.set(SpotLightComponent.Shadow())
-
20:01 - Disable shadow
// Disable shadow let component = DynamicLightShadowComponent( castsShadow: false) entity.components.set(component)
-
21:36 - Enable portal crossing
// Enable portal crossing portal.components.set(PortalComponent(target: portalWorld, clippingMode: .plane(.positiveZ), crossingMode: .plane(.positiveZ))) spaceship.components.set(PortalCrossingComponent())
-
24:33 - Configure environmental lighting on the spaceship
// Configure environmental lighting on the spaceship var lightingConfig = EnvironmentLightingConfigurationComponent() let distance: Float = computeShipDistanceFromPortal() lightingConfig.environmentLightingWeight = mapDistanceToWeight(distance) spaceship.components.set(lightingConfig)
-
27:21 - World tracking camera
// World tracking camera RealityView { content in #if os(iOS) content.camera = .worldTracking #endif }
-
27:59 - Multi-touch control views
// Multi-touch control views #if os(iOS) struct MultiTouchControlView : View { var body: some View { HStack { ThrottleControlView() Spacer() PitchRollControlView() } } #endif
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。