Apple Vision Pro(visionOS2)におけるRealityKit オーディオ(空間オーディオ)の衝突音の実装方法  | 技術ブログ | 株式会社OnePlanet 読み込まれました

Apple Vision Pro(visionOS2)におけるRealityKit オーディオ(空間オーディオ)の衝突音の実装方法

アップルグラスというARグラスの開発が噂されていたAppleの新しい空間コンピューターデバイス『Apple Vision Proは何ができる?』

アップルグラスとして噂されていたARグラスが、日本に上陸。2024年6月28日(金)に発売したAppleの新しい空間コンピューターデバイス、『Apple Vision Pro(アップル ビジョンプロ)』は、AR、VR、XR技術を搭載し、価格は税込599,800円〜です。Apple Vision Proは「何がすごいのか?」について、以下で詳しく紹介しています。

https://ar-marketing.jp/apple-glass-release/


日本初のApple Vision Pro (アップル ビジョンプロ)アプリ開発を手掛けました

第96回アカデミー賞 4部門受賞した映画『哀れなるものたち』(配給:ウォルト・ディズニー・ジャパン株式会社様)の世界に没入体験できるApple Vision Proのアプリの開発から渋谷PARCOでの展示サポートまで株式会社OnePlanetが手掛けました。

詳細:https://1planet.co.jp/news/Twd0qMjt

Apple Vision Pro(アップル ビジョンプロ)やアプリ開発やAR関するご依頼・ご相談など、お気軽にお問い合わせください。


はじめに

宇宙船を使って、RealityKitのオーディオ機能を活用した空間音響のデモを構築します。今回は、衝突音の実装方法ついて説明します。

前回の記事「Apple Vision Pro(visionOS2)におけるRealityKit オーディオ(空間オーディオ)のAudioGeneratorControllerで実現するリアルタイムオーディオ」未読の方は、以下のリンクにあるページもお読み下さい。

Apple Vision Pro(visionOS2)におけるRealityKit オーディオ(空間オーディオ)のAudioGeneratorControllerで実現するリアルタイムオーディオ

衝突音について

宇宙船がコンクリートの床や木の箱、金属の梁、ガラスに衝突する音を上の動画で確認してください。

宇宙船は、スタジオ内で表示されるデジタルオブジェクト(例: 小惑星)や、固定されたデジタルオブジェクト(例: コンクリートの床、木の立方体、金属の梁)と衝突します。また、机や棚と床といった現実にある物にも衝突することがあります。これらに衝突した時の音をリアルにするために、アプリ内で各物体の材質に合った音を追加します。

衝突イベント

import RealityKit

func handleCollisionBegan(_ collision: CollisionEvents.Began) {
    let resource: AudioFileGroupResource // …
    let controller = collision.entityA.playAudio(resource)
    controller.gain = relativeLoudness(for: collision)
}
  1. 衝突イベントの処理

    CollisionEventsを使って衝突が発生したことを検知します。.Beganイベントを処理するメソッドを用意し、衝突した2つの物体の情報を取得します。音を再生するために、既に用意してある音声ファイルを取得し、衝突が起こった物体にあった音を鳴らします。

  2. 音のバリエーションの追加

    AudioFileGroupResourceを使用して、複数の音声ファイルを管理します。衝突時に再生する音声を、音声ファイルの中からランダムに選ぶよう設定します。これにより、同じ衝突でも毎回異なる音が再生され、自然な音を作り出せます。

  3. 音量の調整

    音量の調整には、AudioPlaybackControllerを使います。

    衝突する物体の速度に基づいて、AudioPlaybackControllerのゲイン(音量レベル)を設定します。具体的には、Entityの速度に基づいて音量を計算します。

    高速での衝突の場合は音量を大きくし、低速の場合は音量を抑えることで、衝突の強さを音で表現します。

この方法で、衝突イベントの処理、音のバリエーション、音量の調整が効果的に行えます。

衝突した物質に合った音を鳴らす

今のやり方では、2つの物体が衝突しても同じ音が鳴ります。宇宙船が小惑星、コンピュータースクリーン、または植物と衝突した場合、衝突した物質に合った音を鳴らすことができます。

まず、各物体に衝突したときの音を用意します。たとえば、宇宙船はプラスチック製で、小惑星は岩で作られています。スタジオ環境内の表面にはコンクリート、木材、金属、ガラスなどの素材がラベル付けされています。

オーディオの素材定義

import RealityKit

enum AudioMaterial {
    case none
    case plastic
    case rock
    case metal
    case drywall
    case wood
    case glass
    case concrete
    case fabric
}

struct AudioMaterialComponent: Component {
    var material: AudioMaterial
}

AudioMaterial の enumとAudioMaterialComponentを定義し、EntityにAudioMaterialをセットします。音の衝突音を鳴らすために、すべてのデジタルオブジェクトにAudioMaterialComponentを設定します。

asteroid.components.set(
    AudioMaterialComponent(material: .rock)
)

spaceship.components.set(
    AudioMaterialComponent(material: .plastic)
)

たとえば、小惑星には岩の素材を設定し、宇宙船にはプラスチックの素材を設定します。

import RealityKit

func handleCollisionBegan(_ collision: CollisionEvents.Began) {
    guard 
        let audioMaterials = audioMaterials(for: collision),
        let resource: AudioFileGroupResource = collisionAudio[audioMaterials] 
    else {
        return 
    }
    let controller = collision.entityA.playAudio(resource)
    controller.gain = relativeLoudness(for: collision)
}

2つのデジタルオブジェクトが衝突すると、まず設定したAudioMaterialsを読み取ります。その後、AudioMaterialsのペアリングによってインデックス付けされたAudioFile GroupResourcesから選択します。

宇宙船と小惑星が衝突したときの音は、プラスチックと岩の質感が組み合わさっています。宇宙船がテーブルと衝突する場合の音は、プラスチックと木材の質感が組み合わさった音になります。

現実世界のオブジェクトと衝突処理

現実世界の表面や物体にも同じように音を追加できます。ARKitを使って部屋の中の異なる表面や物体を識別するためのメッシュを作成し、そのメッシュに基づいて音を関連付けることができます。

具体的には:

  1. メッシュの識別
    まず、動的な物体が衝突したメッシュの面を特定します。これにより、どの表面と物体が衝突したのかを把握できます。

  2. メッシュ分類の読み取り
    次に、その面のメッシュ分類を読み取ります。メッシュ分類は、どの材質(例:木材、プラスチックなど)であるかを示します。

  3. カスタム音響素材のマッピング
    メッシュ分類を、オーディオの素材の種類にマッピングします。これにより、デジタルオブジェクトと現実世界のオブジェクトの素材の組み合わせに基づいて正しい音を再生することができます。

これにより、デジタルオブジェクトが実際の物体や表面と衝突したときに、その素材に合ったリアルな音を再生できます。

現実世界のオブジェクトと衝突処理のデモ

宇宙船がテーブル、iMac、または椅子に衝突するとき、その物体の素材にあった音が鳴っていることが確認できます。

完全な没入空間に入ると、デジタルオブジェクトがカスタムの画像を使って異なる光で照らされているのが見えます。オーディオでも同じようにできます。つまり、オーディオソースが実際の部屋の音ではなく、その環境に合わせた音になるように設定します。

これを実現するためには、以下のような手順を踏みます:

  1. デジタルオブジェクトにあった音を設定
    完全な没入空間の各部分に合わせて、特定の音響効果を設定します。例えば、仮想の部屋やエリアに応じた音を作成します。

  2. 音の投影
    実際の部屋ではなく、完全な没入空間に合わせて音を調整します。これにより、完全な没入空間にいるときに、その空間に合った音が聞こえるようになります。

これによって、デジタルオブジェクトと完全な没入空間全体に合わせたリアルな音を体験できます。

Apple Vision Proアプリ開発に対する弊社の取り組み

今後もApple Vision Pro向けのアプリ開発に取り組み、より革新的で魅力的なアプリケーションの開発を続けていきます。

参考

今回、この動画を元に記事を作成しました。

お問い合わせ

Apple Vision Pro(アップル ビジョンプロ)やアプリ開発やAR関するご依頼・ご相談など、お気軽にお問い合わせください。

https://1planet.co.jp/contact

XR エンジニア

徳山 禎男

SIerとして金融や飲料系など様々な大規模プロジェクトに参画後、2020年にOnePlanetに入社。ARグラスを中心とした最先端のAR技術のR&Dや、法人顧客への技術提供を担当。過去にMagic Leap 公式アンバサダーを歴任。

View More

お問い合わせ・ご相談

ARでやってみたいことやお困りごとなど
お気軽にお問い合わせください。

お問い合わせ