visionOSの空間デザインを理解する

visionOSの空間デザインを理解する

Apple Vision Proのリリースが間近に迫っており、ヘッドセット向けアプリを開発する際には開発者が考慮すべき点が数多くあります。VisionOSアプリを開発する際に考慮すべき点をご紹介します。

Apple Vision Proは、Appleにとってインタラクションにおける新たな出発点です。MacやiOS向けのアプリは、主に平面的な画面と既存のユーザーインターフェース言語に依存していますが、VisionOSはそれらを全て放棄し、開発者はユーザーがアプリとインタラクトするための新たな方法を採用せざるを得なくなります。

Appleは、空間コンピューティング向けの設計に関する豊富なドキュメントとチュートリアルを提供しています。visionOS向けアプリを設計する際に留意すべき重要なポイントを以下に示します。

パススルーモードと没入モード

visionOS を使用すると、パススルー モードまたはイマーシブ モードのいずれかでアプリを作成できます。

パススルー モードでは、ユーザーは内蔵の外部カメラを使用して Apple Vision Pro ヘッドセットを通じて周囲を見ますが、アプリとウィンドウは空間に浮かんで表示されます。

このモードでは、ユーザーはジェスチャーや目の動きを使ってユーザーインターフェースを操作できる。

没入モードでは、ユーザーは3Dオブジェクトを含む3D生成シーンに囲まれた完全な3D世界に入ります。没入モードのアプリには、ユーザーがゲーム環境空間自体に入り込むゲームも含まれます。

ほとんどの visionOS アプリでは、Apple は、ユーザーをパススルー モードで開始し、地面または方向を確立し、必要に応じて後で完全に没入感のあるモードに移行することを推奨しています。

これは、アプリの起動時にすぐに 3D 空間に没入することを一部のユーザーが不快に感じる可能性があるためです。

パススルーモード。

パススルーモード。

ジェスチャー

Apple Vision Pro (AVP) は、iOS や iPadOS よりもジェスチャに大きく依存しています。

AVPは、入力デバイスを使わずに、手と目だけでインターフェースを操作できる、初めての主流コンピュータです。ジェスチャーを使って、空間内で手を動かすことでユーザーインターフェースを操作します。

visionOSで入力を受け取ることができるオブジェクトはエンティティと呼ばれます。エンティティは実際にはRealityKitフレームワークの一部です。

visionOS アプリでジェスチャを実装するには、次の 3 つが必要です。

  1. エンティティにはInputTargetComponentが必要です
  2. エンティティには、形状を持つ CollisionComponent が必要です。
  3. ジェスチャーは、対話したいエンティティを対象とする必要があります

visionOS 内のオブジェクトはコンポーネントによって定義され、入力、ワールド、ビュー、ビューアタッチメント、ホバー効果、衝突検出、テキストコンポーネントなど、さまざまなタイプがあります。

各コンポーネントは、visionOS のインターフェースと制御の異なる側面を制御します。Apple はそれぞれに Swift 構造体を定義しています。

InputTargetComponent は、どのオブジェクトがジェスチャの形式で入力を受け取ることができるかを visionOS に伝える構造体です。

InputTargetComponent を追加しないと、visionOS 内のオブジェクトは入力をまったく受け取ることができません。

オブジェクトが直接入力または間接入力を受け取ることができるかどうかも設定できます。

Swift の場合:

myEntity.components.set(InputTargetComponent()

エンティティのどの部分が入力を受け取ることができるかを定義するには、 を追加しますCollisionComponent。衝突コンポーネントには、エンティティ上のヒット テスト領域を定義する図形があります。

形状を変更することで、CollisionComponentエンティティのどの部分がジェスチャ入力を受け入れるか無視するかを変更できます。

エンティティに対する物理ベースの処理を無効にするには、 をCollisionComponent使用して、衝突検出を無効にすることができますCollisionFilter

InputTargetComponents階層的に動作するため、子エンティティを持つ子孫エンティティを持つエンティティに追加すると、InputTargetComponents無効にしない限り、子エンティティが入力を処理します。

InputTargetComponentプロパティを設定することで、受信できる入力の種類を設定できます.allowedInputTypes

子孫InputTargetComponent's .allowedInputTypesプロパティは.allowedInputTypes祖先のプロパティをオーバーライドします。

.allowedInputTypesメソッドを使用して構造体を最初に初期化するときに、を設定することもできますinit()

InputTargetComponentプロパティを設定することで、入力を受け入れるかどうかを切り替えることができます.isEnabled

ジェスチャは、特定のエンティティまたは任意のエンティティを対象とするように設定できます。

ジェスチャの.onEndedメソッドでどのエンティティが入力を受け取ったかは次のようにして確認できます。

let tappedEntity = gestureValue.entity

ほとんどの場合、ウィンドウ、アイコン、3D オブジェクト、RealityKit シーン、ARKit オブジェクトが混在するパススルー モードでエンティティを使用します。

ウィンドウと 3D オブジェクトを使用したパススルー モード。

ウィンドウと 3D オブジェクトを使用したパススルー モード。

ホバーエフェクトコンポーネント

エンティティがインタラクティブなエンティティ (つまり、入力が有効になっている) である場合は、HoverEffectComponentを追加してユーザーを驚かせ、喜ばせることができます。

HoverEffectComponent は、おそらくユーザー インターフェイスの歴史全体の中で最もクールなものでしょう。

インタラクティブ エンティティに HoverEffectComponent を追加すると、visionOS はユーザーがそのエンティティを見るたびに、そのエンティティに目に見えるハイライトを追加します。

ユーザーがエンティティから目を離すと、ハイライトは削除されます。

これは、コンピューターの完全なマインドコントロールから一歩離れたものです。

macOS デスクトップでのシングルクリックや iOS でのテキストの強調表示と同様に、視覚的な強調表示によって、エンティティが選択可能であることがユーザーに伝えられますが、これは目の動き以外の物理的な操作なしで行われます。

ユーザーが visionOS の視野内で視線を動かすと、HoverEffectComponent がある限り、ユーザーが見ているエンティティが強調表示されます。

これはまさに魔法です。Appleにとっても。信じられない。

空間コンピューティングにおける新しい入力デバイスになります。

これは実に非常にエキサイティングな展望です。目でコンピューターを制御できるようになれば、手による手動入力よりもはるかに高速かつ正確になります。

また、障害を持つ人々にとって、コンピューター制御のまったく新しい世界が開かれることになります。

visionOS には、複数の種類のオブジェクトを含む空間や、完全にレンダリングされた 3D シーンを含めることができます。

visionOS には、複数の種類のオブジェクトを含む空間や、完全にレンダリングされた 3D シーンを含めることができます。

バーチャルハンズ

空間コンピューティングの新たな側面の 1 つは、仮想の手というアイデアです。visionOS アプリでは、手を上げて、AVP の視野内にあるオブジェクトを制御できるようになります。

これについては、以前visionOSのサンプルコードに関する記事で取り上げました。Appleはすでに、この方法で動作するデモプログラムをいくつか公開しています。

仮想の手を使うことで、AVP内のビュー内のオブジェクトをタッチして操作できるようになります。これにより、物理的な入力デバイスを使わずに、従来のUIコンセプトである直接操作が可能になります。

バーチャルハンドは、多くの現代のビデオゲームで使用されている画面上の手に似ています。実際、このアイデアは数十年前から、PlayStation 2の画期的なゲーム「Red Faction」など、いくつかのゲームで既に使用されていました。ただし、物理的な入力デバイスが必要でした。

AVP を使用すると、間にハードウェアを介さずに直接オブジェクトに触れているように見えるため、エクスペリエンスはより直接的かつ直感的になります。

仮想の手とジェスチャーを使用して、visionOS の空間内でオブジェクトをタップして移動することができます。

没入型ゲームでも使用できます。

ジェスチャーコントロールに関する追加の考慮事項

ジェスチャー、コントロール、空間インタラクションに関して考慮すべき点が他にもいくつかあります。

遠くにあるオブジェクトを近くのオブジェクトから操作する方法を考える必要があります。AVRの3D空間では、オブジェクトによっては他のオブジェクトよりも遠くに表示されるものもあるため、ユーザーが両方のオブジェクトを操作できるようにする方法も検討する必要があります。

Appleは3D空間と奥行きを考慮することを推奨しています。AVP向けの開発は、従来の画面依存デバイスよりも複雑になります。

快適さと360度の眺望

Appleは快適性の重要性を何度も強調しています。AVPを使用する際は、特に頭部を中心に、体全体を使うことを忘れないでください。

ユーザーは頭をあらゆる方向に回転させ、視点を変えることができます。また、立ったり、回したり、曲げたり、しゃがんだり、座ったりすることも可能です。

アプリを設計する際には、ユーザーに過度の動きや不快に感じる動きを強制しないように、この点に留意する必要があります。

また、反復動作が多すぎるとユーザーの疲労につながるという問題もあります。ユーザーによっては可動範囲が限られている場合もあります。

ユーザーによっては、特定の動作はできるものの、他の動作はできない場合があります。アプリを設計する際には、これらの点に留意してください。

また、AVP自体の重量により、ユーザーの頭に多少の負担がかかることにもご注意ください。首の疲労につながる可能性があるため、長時間同じ姿勢で頭を固定させないようにしてください。

間違いなく、時間の経過とともに AVP の以降の反復がより軽量化されるにつれて、この問題は少なくなるでしょう。

Apple では、360 度ビューやラップアラウンドビューの使用も推奨していません。

ユーザーはさまざまな方向を見ることでビューをパンすることができますが、Apple は開発者が完全な円を描くようなアプリを作成することを望んでいません。

その他の豆知識

Apple は、VisionOS 開発に役立つその他の項目をいくつか挙げています。

Appleは、アプリ起動時にユーザーを没入型シーンに誘導しないことを推奨しています。もちろん、没入型シーンに誘導することは可能ですが、没入型ゲームアプリでない限り、Appleは推奨していません。

没入型ゲームの場合でも、ゲームを開始する前にユーザーが考えを変えたり他のアプリにアクセスしたりできるように、ウィンドウでゲームを開始する必要がある場合があります。

Apple は、重要な瞬間を、visionOS の独自の機能を活用する機能またはインタラクションとして定義しています。

ARKit は、オープンな没入型空間がある場合にのみ、アプリにデータを配信します。

エンティティ上のヒット検出領​​域がどこにあるかを確認するには、「デバッグ視覚化」メニューの「衝突シェイプ」デバッグ視覚化を使用します。

RealityViewアタッチメントを使用してSwiftUIビューをViewAttachmentEntityとして作成することで、visionOSアプリにSwiftUIビューを追加できます。これらのエンティティは、visionOS内の他のエンティティと同様に機能します。

また、Xcode ドキュメントの「没入型空間内のオブジェクト間の関係を理解する」というセクションも必ず参照してください。

現在、visionOS では、画面上のコントロールを使用してウィンドウを作成した後、ウィンドウのサイズを変更したり移動したりすることはできますが、プログラムでこれを行うことはできません。

そのため、ウィンドウを作成する際は、その初期サイズを慎重に検討する必要があります。visionOS は新しいウィンドウを作成すると、ユーザーが現在見ている画面上の場所にウィンドウを配置します。

アプリにビデオを表示するステレオ ビューが含まれている場合は、AVFoundation の AVAsset クラスを使用してビデオを MV-HEVC 形式に変換する必要があります。

visionOS の RealityKit シーンに照明を提供するには、システムに照明を提供させるか、ImageBasedLightComponent を使用してシーンを照らすことができます。

CustomMaterial クラスはvisionOSでは使用できません。シーン用にカスタムマテリアルを作成する必要がある場合は、代わりにReality Composer Proツールを使用して、ShaderGraphMaterial構造体としてマテリアルを作成してください。

AppleはWWDC 23で、RCPにおけるマテリアルの使用に関するビデオセッションを開催しました。WWDCのビデオ「Explore Rendering for Spatial Computing」をご覧ください。

また、WWDC 23 のビデオ「空間デザインの原則」と「視覚と動きのデザインに関する考慮事項」も必ずご覧ください。

メソッドを使用すると、AVP の現在の方向を取得できますqueryDeviceAnchor(atTimestamp:)

空間オーディオとサウンドデザイン入門

AVP エクスペリエンスのもう 1 つの空間部分は、没入型オーディオです。

フルエンバイロンメントオーディオは、特にゲームのソフトウェアでは数十年前から存在しており、ヘッドフォンやサラウンドサウンドのホームシアターシステムを使用することで、ユーザーは長年にわたり臨場感あふれるサウンド体験を楽しむことができました。

しかし、AVP は体験を新たなレベルに引き上げます。

一つには、没入型オーディオを没入型または複合現実の視覚環境に接続することで、これまでのコンピューティングでは不可能だったまったく新しい次元のリアリズムが生まれます。

サウンドとビジュアル体験の両方が連携することで、新たな可能性の基準が生まれます。

脳は、目で見たものと耳で聞いたものを複雑に解釈することで機能します。人間の知覚における空間的な手がかりの多くは、聴覚に基づいています。

例えば、片方の耳に届く音がもう片方の耳よりほんの一瞬早く遅れて届くというわずかな遅延と、頭で音の一部が聞き取れないという状況が組み合わさることで、脳は音がどの方向から来ているかを判断できます。これらは両耳間時間差両耳間レベル差と呼ばれます。

音の高さ、音色、質感、音量、持続時間なども、人間の音の知覚に影響を与えます。反射音も知覚に影響を与えます。

人間は通常、最低 20 Hz から最高 20 Khz までの音の周波数を聞き取ることができますが、この範囲は加齢とともに低下し、これらの範囲を超える音を聞き取れる人もいます。

従来のコンパクトディスクのオーディオフォーマットは、人間の可聴域の最高周波数の2倍である44.1KHzで音をサンプリングします。これはナイキスト限界に基づいています。ナイキスト限界とは、録音されたサンプリングによって音を正確に捉えるには、サンプリング周波数が人間の最高周波数の2倍でなければならないというものです。

人間の聴覚の奇妙な点の 1 つは、円錐形の表面から発生する音や円錐形の表面で反射する音の位置を特定するのが難しいことです。これは、このような形状が自然界にほとんど存在しないため、驚くことではありません。

直接音と反射音。提供:Resonance Audio。

直接音と反射音。提供:Resonance Audio。

視覚と音の入力が適切に組み合わされ同期されると、脳は何も考えなくても自動的に関連付けと判断を行います。

普段の知覚のほとんどは、こうした複雑な解釈と感覚入力に基づいています。脳が空間における自分の位置を認識するのも同様です(バランスに影響を与える内耳からの入力と組み合わさって)。

AVPは、映像と没入型サウンドの同期入力を可能にするため、新たなレベルの体験を提供します。アプリを設計する際には、この点も念頭に置いてください。

ユーザーにできるだけリアルな体験を提供したいと考えていますが、これはサウンドと映像の両方を慎重に使用することで最も効果的に実現できます。

非没入型アプリの場合は、オーディオ キューを使用して、インタラクションをよりリアルにします。

たとえば、ユーザーがボタンをタップしたときに微妙なオーディオ応答を使用したり、オーディオを再生して、ユーザーが見ているオブジェクトから直接音が鳴っているように見せたりすることができます。

没入型アプリを開発する場合、ユーザーが目にする映像と音声が正確に一致するよう、音声を慎重に調整する必要があります。ゲームの場合は、ゲームプレイのイベントや環境と正確に一致するように、3Dオーディオキューを使用することが重要です。

ADSR

すべてのサウンドには、 ADSR (アタック、ディレイ、サステイン、リリース) と呼ばれるものがあります。

アタックとは、音量がゼロから最大まで変化する速度、または傾きのことです。完全に垂直なアタックとは、音が無音から最大まで瞬時に変化することを意味します。

遅延とは、音が最大またはピークから標準の音量に下がるまたは落ち着くまでの時間であり、これは音の最終段階、つまりリリースまで続きます。

サステインとは、遅延時間後に音が標準音量でどれだけ長く持続するかを指します。これは、ほとんどの人が音として認識するレベルです。

リリースとは、音がフェードアウトし始めてから音量がゼロ、つまり無音になるまでの時間です。リリースフェーズは、サステイン期間の終わりから無音になるまでの時間です。

完全に垂直なリリースカーブは、音が標準音量から瞬時に無音状態になることを意味します。極端に長く浅いリリースカーブは、音が時間の経過とともに非常にゆっくりとフェードアウトすることを意味します。

Apple Music アプリでクロスフェード効果を使用したことがあるなら、浅いアタックとリリースのカーブを聞いたことがあるでしょう。

完全に垂直なアタックまたはリリースを持つサウンドは、ゲートサウンドと呼ばれます。

サウンドの 4 つの ADSR 値をまとめてエンベロープと呼びます。

ほとんどのプロフェッショナル向けサウンド編集ソフトウェアでは、サウンドのADSRグラフ上の4つのポイントをすべて調整できます。ADSRを変更すると、ユーザーのサウンドの知覚が変化します。

ADSR を使用すると、サウンドに非常に興味深く微妙な効果を加えることができます。

ADSR はもともと合成音楽にのみ使用されていましたが、今日のプロ用サウンド ソフトウェアでは、サンプリングされた (録音された) サウンドにも ADSR を適用できます。

PlayStation 2 サウンド エディターでの ADSR 調整。

PlayStation 2 サウンド エディターでの ADSR 調整。

効果音

visionOS 用の没入型ゲームを作成する場合は、サウンド効果について慎重に検討する必要があります。

例えば、ゲームに遠くで爆発音や銃声が聞こえるとします。それぞれの音の相対的な音量が効果音の距離と強度に一致するように、サウンドのタイミングとミックスを調整する必要があります。

没入型ゲームにおけるサウンドのリアリティは、環境内の素材にも依存します。

ゲーム内に爆発や銃撃が発生する巨大な岩の峡谷が登場しますか?もしそうなら、峡谷の壁で音が反響するリアルなエコー効果を複数追加する必要があります。

また、各音をユーザーを基準に3D空間に配置する必要があります。ユーザーの前、後ろ、横、あるいは上や下など、様々な方向から音を捉えることができます。現実世界では、特定の音は同時にあらゆる方向から聞こえてくるように聞こえることがあります。

現実世界では、他の種類の音によって、参加者が一時的に耳が聞こえなくなったり、しばらく耳鳴りがするだけになったりすることがあります (手榴弾による脳震盪が思い浮かびます)。

ゲームの設定では、何マイルも離れた場所で爆発が起こりますが、現実の世界では、視聴者は実際に爆発音を目にしてから数秒経たないとその音を聞くことができません。

このようなちょっとした工夫が、アプリにさらなるリアリティを加えます。

さらに、サウンド再生中にユーザーが頭を動かし、視点や視野が変化する可能性があることにも留意してください。ユーザーの視点の変化に応じて、3D空間におけるサウンドの空間的な手がかりをリアルタイムで調整する必要があるかもしれません。

Ressonance Audio、OpenAL など、これを支援するオーディオ ライブラリはありますが、AVP で空間オーディオがどのように進化するかは待つ必要があります。

ゲームのサウンド デザインはそれ自体が独立した分野です。

現実世界で音がどのように機能するかを深く知りたい方は、Richard Berg と David Stork による優れた書籍『The Physics of Sound』をご覧ください。ただし、ある程度の数学が必要です。

AppleのVisionOSに関するQ&A

WWDC 23 および最近の開発者ラボで、Apple は visionOS の専門家とのセッションを数回開催し、その結果、Apple はさらに多くのトピックを網羅する visionOS Q&A をまとめました。

これをチェックして、visionOS アプリが可能な限り優れたものになるかどうかを確認してください。