WWDC Quick Look 💓 By SwiftGGTeam
What's new in USD

What's new in USD

元の動画を見る

ハイライト

Apple と Pixar は、Reality Composer がアンカリング、動作、物理、空間オーディオ、3D テキスト、再生メタデータを USDZ に書き込み、この AR 情報を DCC と RealityKit ワークフロー間で保持できるようにする一連の予備的な AR USD スキーマを提案しました。


主要内容

これまで AR アセットで作業する場合、ツール間でプロセスが簡単に切断されてしまいました。アーティストは Houdini または Maya でモデルを変更し、開発者は Reality Composer でビヘイビア、アンカー、物理学を追加します。ファイルを DCC に返すと、DCC が AR 情報を認識できない場合があります。このモデルは、インタラクション ロジックがバイパス データになる可能性があり、チームが手動でやり直すか、リフローを停止することしかできないことを示すこともできます。

このセッションはこのブレークポイントを解決します。 Reality Composer は 2020 年に USDZ エクスポートを追加し、Apple は Pixar と協力して一連の予備的な AR USD スキーマを提案しました。 Reality Composer のシーン、アンカリング、動作、物理学、空間オーディオ、3D テキスト、再生メタデータを USD 構造に表現します。このようにして、アセットを Reality Composer から Houdini にエクスポートし、編集を続けてから、元の動作をファイル内に残したまま Reality Composer に戻すことができます。

プレゼンテーション内のレーシングデモは非常に直感的でした。フラグ アセットは、Reality Composer のタップ動作で最初に追加されました。次に、それを USDZ としてエクスポートし、Houdini に入れて車をアニメーション化しました。 Houdini はその時点では動作スキーマを理解していないため、フラグのインタラクションを再生しません。しかし、この情報は捨てられません。アセットが Reality Composer に返された後、元のクリック動作を再度トリガーできます。 USDZ は、「最終納品形式」から、ツール チェーンの内外で反復できる作業ドキュメントへと移行します。

後半はスキーマ自体に移ります。 Apple は、エクスポート ボタンを導入するだけでなく、この AR 情報が USDA テキストでどのように編成されているかを示しています: シーン ライブラリを使用してkind = "sceneLibrary"複数のシーンを配置します。アンカーリングは適用されたスキーマを使用してプリムに接続します。動作は、トリガーとアクションの関係を使用して相互作用を記述します。物理学ではシミュレーションを記述するためにコライダー、剛体、材料、重力を使用します。オーディオと 3D テキストは新しいプリム タイプを使用して USD シーンに参入します。


詳細

1. Reality Composer が USDZ をエクスポートした後、DCC ループは AR 情報を遮断しません

(03:31) このスピーチでは、最初に新しいワークフローが示されています。Reality Converter が DCC アセットを USDZ に変換し、Reality Composer がインタラクション、物理学、アンカリングを追加して、USDZ をエクスポートすると、引き続き USDZ をサポートする DCC に入ることができます。主な変更点は、エクスポート ターゲットが Reality File から USDZ に拡張され、アセットがプレビューまたは配信のみ可能なエンドポイントに到達する必要がなくなったことです。

キーポイント:

  • Houdini、Maya、Unity、Unreal Engine、Adobe Aero、およびその他の DCC はすでに USD のインポートまたはエクスポートをサポートしています。
  • Reality Converter は、外部アセットを Apple の USDZ ワークフローに取り込む役割を果たします。
  • Reality Composer は、インタラクション、物理学、アンカリングを追加するための AR セマンティクスの編集ポイントです。
  • USDZ エクスポートは 2020 年の新機能で、Reality Composer 製品を引き続き DCC で編集できるようになります。
  • RealityKit アプリが最終的な使用場所であり、講演者はデモの最後にコンテンツを RealityKit アプリにインポートし、公開の準備をします。

(07:44) デモでは、Houdini は動作スキーマを理解していないため、フラグの動作は再生されません。しかし、アクションは USDZ 内に残ります。これらの動作は、ファイルが Reality Composer または RealityKit アプリに返された後に再び発生します。

キーポイント:

  • フラグ アセットには、Reality Composer でのタップ動作がすでにあり、動作が実行され、追加のコンテンツが表示されます。
  • Houdini は動作スキーマを理解していませんが、アセットを配置してシーンをエクスポートすることはできます。
  • 新しいスキーマの互換性の目標は、未知の AR 情報を USDZ 内に保持することです。
  • ファイルが Reality Composer に返された後も、フラグの元のクリック動作をトリガーできます。

2. シーン ライブラリを使用すると、USD ファイルに複数のロード可能なシーンを含めることができます

(11:29) Reality Composer プロジェクトには複数のシーンを含めることができます。 USD の式では、ルート プリムを次のようにマークします。sceneLibrary、その下に各シーンを置きます。defアクティブなシーンを表現し、over非アクティブなシーンを表します。 RealityKit は、シーン名によってシーンの 1 つをロードできます。

def Xform "Root" (
    kind = "sceneLibrary"
)
{
    def Cube "MyCubeScene" (
        sceneName = "My Cube Scene"
    )
    {
        ...
    }

    over Sphere "MySphereScene" (
        sceneName = "My Sphere Scene"
    )
    {
        ...
    }
}

キーポイント:

  • kind = "sceneLibrary"ルート ノードをシーン ライブラリとして宣言します。
  • def Cube "MyCubeScene"古いツールでも引き続き表示されるアクティブなシーンを定義します。
  • over Sphere "MySphereScene"非アクティブなシーンを定義します。同じファイルに保存されているがデフォルトでは表示されないシーンに使用されます。
  • sceneNameは人間が読める名前であり、RealityKit は、Reality File シーンをロードするのと同じように、名前でロードできます。
  • このスピーチは現在のサポート範囲を明らかに制限しています。RealityKit、AR Quick Look、および Reality Composer は単一のアクティブ シーンのみをサポートし、ネストされたシーンは現在サポートしていません。

3. アンカリング スキーマは現実世界のアンカー ポイントをプリムに書き込みます

(13:00) アンカーリングは、コンテンツが現実世界のどの参照オブジェクトに表示されるかを記述します。スキーマは、水平面、垂直面、画像、顔の 4 つのタイプをサポートします。 AR オブジェクトと地理位置情報アンカーは現時点ではまだサポートされていません。

def Cube "ImageAnchoredCube" (
    prepend apiSchemas = [ "Preliminary_AnchoringAPI" ]
)
{
    uniform token preliminary:anchoring:type = "image"
    rel preliminary:imageAnchoring:referenceImage = <ImageReference>

    def Preliminary_ReferenceImage "ImageReference"
    {
        uniform asset image = @image.png@
        uniform double physicalWidth = 12
    }

    ...
}

キーポイント:

  • prepend apiSchemasアンカリング適用スキーマをキューブプリムにハングします。
  • preliminary:anchoring:type = "image"この立方体が画像のアンカー ポイントに位置合わせされていることを示します。
  • referenceImageこの関係は、同じ USD 内のイメージ参照プリムを指します。
  • image = @image.png@USDZ 仕様に準拠した JPG または PNG 画像を引用します。
  • physicalWidth = 12DCC による単位変更後のアンカー ポイント サイズへの影響を避けるために、実際の画像の幅をセンチメートル単位で定義します。

4. 動作スキーマは、トリガーとアクションの関係を使用してインタラクションを記述します。

(14:13) Reality Composer の動作はトリガーとアクションで構成されます。 USD スキーマでは、Preliminary_Behaviorトリガーとアクションの間の関係配列を保持します。トリガーとアクションは再利用されますinfo:idおよびその他の属性記述タイプ。

def Preliminary_Behavior "TapAndBounce"
{
    rel triggers = [ <Tap> ]
    rel actions = [ <Bounce> ]

    def Preliminary_Trigger "Tap"
    {
        uniform token info:id = "tap"
        rel affectedObjects = [ </Cube> ]
    }

    def Preliminary_Action "Bounce"
    {
        uniform token info:id = "emphasize"
        uniform token motionType = "bounce"
        rel affectedObjects = [ </Cube> ]
    }

    ...
}

キーポイント:

  • rel triggers動作を開始するトリガー プリムを指します。
  • rel actionsトリガー後に実行されるアクション プリムを指します。
  • info:id = "tap"トリガーをタップ トリガーとしてマークします。
  • affectedObjects = [ </Cube> ]観察または影響を受けるオブジェクトを示します。
  • info:id = "emphasize"そしてmotionType = "bounce"Reality Composer でバウンス効果を組み合わせます。

(16:18) 同じ動作に複数のトリガーと複数のアクションを含めることができます。複数のトリガーは、いずれか 1 つが満たされた場合にアクションをトリガーします。複数のアクションが順番に実行されます。アクション データ スキーマは、シリアルまたはパラレル アクション グループを表現するために使用されるグループ アクションもサポートします。

def Preliminary_Behavior "TapOrGetCloseAndBounceJiggleAndFlip"
{
    rel triggers = [ <Tap>, <Proximity> ]
    rel actions = [ <Bounce>, <Jiggle>, <Flip> ]

    ...
}

キーポイント:

  • <Tap>そして<Proximity>トリガーの入り口は2つあります。それらのいずれかが満たされた場合、アクションを呼び出すことができます。
  • <Bounce><Jiggle><Flip>順次実行されます。
  • 動作はシーンとともに自動的にロードされます。複数のシーン USD で定義されている場合、それが配置されているシーンに限定されます。

5. 物理スキーマは、コライダー、剛体、材料、地面、重力をカバーします

(17:02) 物理スキーマは、Reality Composer で物理シミュレーションを記述するために使用されます。この講義では、いくつかのステップで木製ボールを構築します。最初にコライダーと剛体をプリムに適用し、次に物理マテリアルをマテリアルに適用し、次に無限コライダー プレーンをシーンに追加し、最後に重力を定義します。

def Sphere "WoodenBall" (
    prepend apiSchemas = [ "Preliminary_PhysicsColliderAPI",
                           "Preliminary_PhysicsRigidBodyAPI" ]
)
{
    rel preliminary:physics:collider:convexShape = </WoodenBall>
    double preliminary:physics:rigidBody:mass = 10.0
}

キーポイント:

  • Preliminary_PhysicsColliderAPIこの球を衝突検出に参加させます。
  • Preliminary_PhysicsRigidBodyAPI剛体シミュレーションにオブジェクトを含めます。
  • convexShape = </WoodenBall>オブジェクト独自のジオメトリを凸型コライダーとして使用します。
  • mass = 10.0組成や DCC 単位の変更によって生じる誤差を減らすために、質量をキログラム単位で記録します。
def Material "Wood" (
    prepend apiSchemas = ["Preliminary_PhysicsMaterialAPI"]
)
{
    double preliminary:physics:material:restitution = 0.603
    double preliminary:physics:material:friction:static = 0.375
    double preliminary:physics:material:friction:dynamic = 0.375
}

def Sphere "WoodenBall" (
    prepend apiSchemas = [ "Preliminary_PhysicsColliderAPI",
                           "Preliminary_PhysicsRigidBodyAPI" ]
)
{
    rel preliminary:physics:collider:convexShape = </WoodenBall>
    double preliminary:physics:rigidBody:mass = 10.0
    rel material:binding = </Wood>
}

キーポイント:

  • Preliminary_PhysicsMaterialAPI既存のものに適用されるMaterialプリムオン。
  • restitution反発特性について説明します。
  • friction:staticそしてfriction:dynamic静摩擦と動摩擦について説明します。
  • material:binding = </Wood>物理マテリアルを球にバインドします。

(18:40) 地面は無限コライダー プレーンで表され、カスタム データを通じてシーン グラウンド プレーンとしてマークされます。講演では、USD の古いバージョンでもファイルを開くことができるように説明されています。

def Xform "MyScene" (
    prepend apiSchemas = ["Preliminary_PhysicsColliderAPI"]
)
{
    def Preliminary_InfiniteColliderPlane "groundPlane" (
        customData = {
            bool preliminary_isSceneGroundPlane = 1
        }
    ) {
        point3d position = (0, 0, -2)
        vector3d normal = (0, 1, 0)
        rel preliminary:physics:collider:convexShape = </MyScene/groundPlane>
    }
    rel material:binding = </Wood>
}

キーポイント:

  • Preliminary_InfiniteColliderPlane無限衝突面を定義します。
  • preliminary_isSceneGroundPlane = 1それをシーングラウンドとしてマークします。
  • positionそしてnormal平面の位置と法線を指定します。
  • material:binding = </Wood>以前に定義した木材物理マテリアルを再利用します。

(19:08) 重力は、シーン内の重力プリムによって表されます。この話は、シーンが定義する重力は 1 つだけであることを示唆しています。

def Preliminary_PhysicsGravitationalForce "MoonsGravity"
{
    vector3d physics:gravitationalForce:acceleration = (0, -1.625, 0)
}

キーポイント:

  • Preliminary_PhysicsGravitationalForceシーン内の重力を定義します。
  • (0, -1.625, 0)講義で使用された月の重力の例です。
  • 講義では、シーンごとに重力を 1 つだけ定義することを推奨しています。

6. 空間オーディオ、3D テキスト、再生メタデータは USD に入る

(19:35) オーディオ スキーマは動作スキーマから分離されています。ビヘイビアーはオーディオ再生アクションをトリガーできます。オーディオ スキーマ自体は、オーディオ コンテンツを USD に埋め込み、再生モード、開始時間、メディア オフセット、ボリューム、空間位置を指定する役割を果たします。

def SpatialAudio "HorseNeigh"
{
    uniform asset filePath        = @Horse.m4a@
    uniform token auralMode       = "spatial"
    uniform timeCode startTime    =  65.0
    uniform double mediaOffset    =  0.33333333333
    double3 xformOp:translate = (0, 0.5, 0.1)
    uniform token[] xformOpOrder = ["xformOp:translate"]
}

キーポイント:

  • SpatialAudioUSD でオーディオを記述するために使用される新しいプリム タイプです。
  • filePath = @Horse.m4a@参考音声ファイル。
  • auralMode = "spatial"サウンドが特定のトランスフォームから発せられることを示します。
  • startTimeそしてmediaOffsetタイムライン上のオーディオの開始点とマテリアル内のオフセットを制御します。
  • xformOp:translate音を空間に配置するために、スピーチの例は馬の口の近くからのものです。

(21:26) 3D テキスト スキーマは、Reality Composer のテキスト コンテンツ、フォント、行の折り返し、配置情報を USD に書き込みます。

def Preliminary_Text "heading"
{
    string content = "#WWDC20"
    string[] font = [ "Helvetica", "Arial" ]
    token wrapMode = "singleLine"
    token horizontalAlignment = "center"
    token verticalAlignment = "baseline"
}

キーポイント:

  • content = "#WWDC20"は、スピーチ内のテキストコンテンツの例です。
  • fontメイン フォントとフォールバック フォントをサポートします。
  • wrapMode単一行または行の折り返しを制御します。
  • horizontalAlignmentそしてverticalAlignmentテキストの配置を制御します。

(22:46) 再生メタデータは、アニメーションとオーディオがループしているかどうか、および自動的に再生するかどうかを視聴者に伝えます。講演では、Reality Composer によってエクスポートされたコンテンツはデフォルトで自動再生がオフになっているため、動作によって明示的に制御できると述べられました。

#usda 1.0
(
    endTimeCode = 300
    startTimeCode = 1
    timeCodesPerSecond = 30
    playbackMode = "loop"
    autoPlay = false
)

def Xform “AnimatedCube"
{
    ...
}

キーポイント:

  • playbackMode = "loop"アニメーションをループするように視聴者に促します。
  • autoPlay = false読み込みが自動的に開始されないことを示します。
  • timeCodesPerSecond = 30ステージのアニメーションとオーディオで使用されるタイムコードの速度を定義します。

(23:08) シーン理解メタデータにより、シーン コンテンツと LiDAR によって生成された実際の環境の間の物理的な相互作用が可能になります。

def Xform "Root" (
    kind = "sceneLibrary"
)
{
    def Xform "MyScene" (
        sceneName = "My Scene"
        preliminary_collidesWithEnvironment = true
    )
    {
        def Xform "DigitalBug"
        {
            ...
        }
    }
}

キーポイント:

  • preliminary_collidesWithEnvironment = trueこのシーンを特徴づけるコンテンツは、シーンの理解によって生成された実際の環境と相互作用します。
  • この機能は、LiDAR スキャナーを備えた iPad Pro 上の RealityKit および ARKit によって提供されるシーンの理解に対応します。
  • メタデータは、シーンレベルの環境インタラクションの意図を表現するためにシーンに配置されます。

重要ポイント

1. 前後に編集できる AR アセット受け入れツールを作成する

  • 何をすべきか: アーティストから提供された USDZ をインポートし、シーン ライブラリ、アンカリング、動作、物理学、オーディオおよび再生メタデータが含まれているかどうかを確認し、承認レポートを生成します。
  • 実行する価値がある理由: このセッションの核心は、AR 情報が DCC 往復で保存される必要があるということです。アクセプタンス ツールは、アセットがアプリケーションに入る前に、欠落している動作、欠落しているアンカー、または誤って設定された自動再生を検出できます。
  • 開始方法: USD ツールを使用して USDA/USDZ を読み取り、最初に確認しますkind = "sceneLibrary"Preliminary_AnchoringAPIPreliminary_BehaviorSpatialAudioそしてautoPlay結果をアート チームと開発チームに見せる前に、フィールドを待ってください。

2. Reality Composer と Houdini を使用してレーシング テンプレートのセットを作成する

  • 内容: 車両、道路、旗、オーディオ、タップ動作を再利用可能なテンプレートに作成し、アーティストがモデルとアニメーション カーブのみを置き換えることができるようにします。
  • 価値がある理由: セッション デモでは、Reality Composer の動作が Houdini のラウンドトリップ全体で機能し続けることが証明されました。このタイプのテンプレートは、マーケティング ページ、ショールーム、教育プレゼンテーションでの短い AR アニメーションに適しています。
  • 開始方法: まず、Reality Composer でキー オブジェクトにタップ動作とアニメーション アクションを追加し、次に USDZ を Houdini にエクスポートして大きなアニメーションを配置し、最後に Reality Composer に戻って空間オーディオと最終トリガー ロジックを追加します。

3. 画像付きの製品説明カードを作成する

  • 操作方法: 製品パッケージまたは取扱説明書の画像をスキャンした後、その上に 3D テキスト、モデル分解アニメーション、空間効果音を表示します。
  • 実行する価値がある理由: アンカー スキーマは画像のアンカーをサポートし、3D テキスト スキーマはテキストをサポートし、空間オーディオ スキーマはサウンドの定位をサポートします。 3 つを組み合わせると、静止した紙を AR 命令に変えることができます。
  • 開始方法: USD でモデル プリムを適用しますPreliminary_AnchoringAPI、バンドルpreliminary:anchoring:typeに設定imageを追加します。Preliminary_TextそしてSpatialAudioプリム。画像の幅はセンチメートル単位で入力されますphysicalWidth

4. 物理的なマテリアルを使用して AR 教育実験を行う

  • やるべきこと: 生徒に、テーブル上の異なる重力下での木製ボール、ゴムボール、プラスチックボールの跳ね返りと摩擦を比較させます。
  • 実行する価値がある理由: 物理スキーマは、剛体、コライダー、物理マテリアル、接地面、重力をカバーします。抽象的な物理パラメータを観察可能な AR シーンに変換するのに適しています。
  • 開始方法: コライダーと剛体スキーマを球に適用し、異なるマテリアルを設定しますrestitutionそしてfriction、次に使用しますPreliminary_PhysicsGravitationalForce地球や月などの重力パラメータを切り替えます。

5. AR アニメーション プレーヤーのコンテンツ仕様のセットを作成する

  • やるべきこと: アプリ内 USDZ アニメーションに統一ルールを提供するplaybackModeautoPlay、オーディオオフセットとシーン理解ルール。
  • 実行する価値がある理由: セッションで言及された再生メタデータは、再生ボタンとループ方法を表示する方法を視聴者に促します。 Reality Composer によってエクスポートされたコンテンツはデフォルトでは自動再生されないため、動作ドライバーを使用すると便利です。
  • 開始方法: アセット エクスポート パイプラインをチェックインします。startTimeCodeendTimeCodetimeCodesPerSecondplaybackModeそしてautoPlay。現実の環境と衝突する必要があるシーンに加えて、preliminary_collidesWithEnvironment = true

関連セッション

  • アーティストの AR ツールキット - Reality Converter、Reality Composer、AR Quick Look が AR アセット制作チェーンをどのように形成するかを示します。
  • AR Quick Look を使用してオンラインで購入 — USDZ 製品モデルを Web ページに配置する方法と AR Quick Look の購入プロセスについて説明します。
  • ARKit 4 を探索する — ロケーション アンカー、シーン ジオメトリ、深度などの ARKit 4 の機能を紹介します。
  • RealityKit の新機能 — RealityKit のレンダリング、アニメーション、物理、オーディオ機能を紹介し、これらをこの分野の USDZ コンテンツ表現と接続します。

コメント

GitHub Issues · utterances