はじめに

直近開発している生け花アプリでは、3D データを用いて、iPhone や iPad、Mac 等の Apple プラットフォームで生け花体験提供すること目指しています。このアプリの開発にあたり、3D モデルのフォーマットの一つであるUSDZファイルを毎日のように触っているので、今回記事として usdz ファイルに関してまとめておきます。

USDZに限らずですが、近年、3D データの利用は、エンターテインメント、デザイン、教育、そしてビジネスの世界でますます重要性を増しています。特に、Apple の ARKit や RealityKit などの拡張現実(AR)技術の普及、Vision Pro の販売開始などにより、リアルな 3D モデルを簡単に活用できるプラットフォームが広がり続けています。その中で注目を集めているファイル形式の一つが、USDZ ファイルフォーマットです。

本記事では、USDZ ファイルおよびその基盤となる USD(Universal Scene Description)について、基本的な概念から具体的な利用方法までを解説します。さらに、USDZ Tools のコマンドを具体例を用いて詳細に説明し、これらのツールを使用して USDZ ファイルを操作する方法やトラブルシューティングも取り上げようと思います。

また私自身生け花アプリの開発の中で学んだ 3D 技術の基礎知識を整理しておきたいという思いもあります。

ちなみに、VisionOS はまださわれていません。。。

対象読者

本記事は以下のような方を対象としています。

  1. iOS アプリデベロッパー: ARKit や RealityKit を使用してアプリを開発している、またはこれから始めようと考えている方。
  2. 3D モデリングの初心者や中級者: Blender や Maya などのツールで 3D モデルを作成し、USDZ フォーマットでのエクスポートを学びたい方。
  3. 3D ファイルフォーマットに興味がある技術者: USD や USDZ の内部構造や、それらの操作方法に関心がある方。

本記事の目的

本記事を読むことで、以下の内容を習得できることを目指しています。

  • USD と USDZ の基本的な概念と歴史を理解する。
  • USDZ ファイルの構造や作成方法を学ぶ。
  • USDZ Tools のコマンドを使用して、USDZ ファイルを効果的に操作する方法を習得する。
  • 実際の AR アプリケーションやデザインプロジェクトで USDZ ファイルを活用する具体的なヒントを得る。

この記事を通じて、3D データの操作スキルを向上させ、最新の技術を活用する一助となれば幸いです。

USD と USDZ の基本

1. USD(Universal Scene Description)とは?

USD(Universal Scene Description)は、Pixar Animation Studios が開発したオープンソースの 3D シーン記述フォーマットです。この技術は、複雑な 3D アセットを効率的に管理、共有、レンダリングするために設計されました。

USD の歴史と開発の背景

USD は、Pixar の内部ツールとして開発が始まりました。映画製作における膨大な 3D データの管理と編集を効率化する必要があり、複数のツールやアーティスト間でのコラボレーションを容易にするための共通基盤として生まれました。2016 年にオープンソース化され、多くの業界で採用されています。

Pixar といえば、Toy Story を始めとする様々なアニメーションの制作を手掛けております。あれらの映画の中で使用されている 3D データのすべてが USDZ でできております。

USD公式サイト

オープンソース化以来、Pixar 以外の企業や個人による貢献が続いており、現在では AR や VR、ゲーム開発など、多岐にわたる分野で利用されています。

2. USD と USDZ の違い

ここまで USD と USDZ という言葉が出てきましたが、それらの違いは何なのでしょうか?

USD フォーマットの構造

USD は、3D データを記述するための柔軟なフォーマットで、以下の 3 つの主要な形式があります。

  • .usd: バイナリ形式で、高速な読み書きが可能。
  • .usda: テキスト形式で、人間が読みやすい構造。
  • .usdc: 圧縮形式で、ストレージ効率が高い。

USDZ フォーマットの特徴と用途

USDZ は、USD を基盤としたアーカイブ形式で、主に Apple のエコシステムで使用されます。用は USD を zip しているので、USDZ なんですね。USDZ ファイルは、以下の特徴を持っています。

  • 単一ファイルで構成: 必要なアセット(モデル、テクスチャなど)がすべて含まれる。
  • 軽量で高速: モバイルデバイスでのリアルタイムレンダリングに最適化。
  • 非圧縮 ZIP 形式: 開く際にデコード処理が不要。

3. USDZ ファイルの利点と制約

USDZ ファイルは、以下のような利点があります。

利点

  • シンプルさ: 単一ファイル形式で、管理が容易。
  • 高速レンダリング: モバイルデバイスや AR プラットフォームでの効率的なパフォーマンス。
  • Apple 製品との互換性: ARKit や Quick Look での即時プレビューが可能。

制約

  • 非編集性: アーカイブ形式のため、直接編集は難しい。
  • 他プラットフォームでの制限: Apple エコシステム外でのサポートが限定的。

USDZ の利点と制約を理解することで、適切なユースケースに応じた活用が可能になります。

特に、3D モデラーと開発を進める中で、データの共有が簡単であったり、Mac の Finder 上での QuickLook で即座に中身を確認できたりと、かなり開発効率が良いということを実感しています。

例えば、別の 3D ファイルフォーマットを使用していたとしたら、ファイルがバラバラであったり 3D ツールを使用しないと中身が確認できなかったりと、色々と不便だったかと思います。

USDZ ファイルの構造

1. USDZ ファイルの内部構造

USDZ ファイルは、ZIP ベースのアーカイブ形式として設計されており、3D モデル、テクスチャ、マテリアルなどのリソースを 1 つのファイルにまとめることができます。これにより、データの管理や共有が簡素化されます。

主な構成要素

  • .usd ファイル: 3D モデルのシーン記述を保持。
  • テクスチャファイル: PNG や JPEG などの形式で保存され、モデルの外観を定義。
  • マテリアルファイル: PBR(物理ベースレンダリング)モデルをサポート。

これらのファイルは、圧縮されていない ZIP アーカイブとして保存されるため、簡単にアクセスや検査が可能です。

2. マテリアルとテクスチャの扱い

USDZ は、リアルな外観を実現するために、PBR ベースのマテリアルシステムを採用しています。

PBR の基本要素

  • Base Color: オブジェクトの基本的な色を定義。
  • Metalness: 金属の特性を制御。
  • Roughness: 表面の滑らかさを調整。

これらのプロパティを使用して、現実世界の物理的特性を忠実に再現します。

3. アニメーションやカメラのデータ

USDZ は、アニメーションやカメラ情報もサポートしており、複雑なシーンを作成することが可能です。

USDZ は zip して複数の情報をまとめており、アニメーションまでもを組み込むことができるという点が魅力的です。

アニメーション

  • オブジェクトの移動、回転、スケーリングのキーフレームを記録。
  • 時間ベースのアニメーションを含む複数のトラックをサポート。

カメラ

  • カメラの位置、方向、焦点距離などのデータを保持。
  • シーン内での視点を再現可能。

これにより、USDZ は単なるモデルフォーマットではなく、シーン全体を表現する強力なツールとして活用できます。

Apple の Resource として無料公開されている 3D モデルもありますので、是非触ってみてください。

Quick Look

USDZ ファイルの作成と編集

Blender を使用した USDZ ファイルのエクスポート

Blender は、USDZ ファイルの作成において人気の高いオープンソースの 3D モデリングツールです。以下は、Blender で USDZ ファイルをエクスポートする手順と注意点です。

手順

  1. モデルの準備: モデルのスケールや座標を適切に設定し、テクスチャやマテリアルを適用します。
  2. USD 形式でエクスポート: Blender のファイル > エクスポート > USD を選択します。

images/1.png

  1. USDZ への変換: 拡張子を USDZ に入力し直して、右下のエクスポートを実行します。

images/2.png

出力された usdz ファイルを Finder の QuickLook で確認してみます。グリグリと動かして様々な角度から確認できるのがお手軽で良いですね。

images/3.png

他の 3D ツールとの連携

Blender 以外にも、Maya や Cinema 4D などのプロフェッショナル向け 3D ツールが USDZ 形式のエクスポートをサポートしています。一部プラグインが必要であったりする場合もあるようですが、Blender をはじめとしてほとんどの 3D ツールで USDZ ファイルフォーマットのエクスポートが対応なされています。

Reality Converter による簡易的な編集

Apple が提供する Reality Converter は、USDZ ファイルの簡易的な編集と検証に便利なツールです。

空間アプリ向けの制作ツール

主な機能

  • プレビュー: USDZ ファイルの外観をリアルタイムで確認可能。
  • テクスチャの適用: 新しいテクスチャをドラッグ&ドロップで追加可能。

使用手順

  1. Reality Converter を起動し、編集したい USDZ ファイルをドラッグ&ドロップします。
  2. 必要に応じて、テクスチャやマテリアルを変更します。
  3. 編集内容を保存して、更新された USDZ ファイルをエクスポートします。

これらのツールとワークフローを活用することで、効率的に高品質な USDZ ファイルを作成することが可能です。

試しに、Apple で公開されている 3D データを少し編集して見ましょう。今回は、Quick Lookにある、赤色の椅子を使ってみます。

images/4.png

Reality Converter を立ち上げるとこのような画面になるので、ここに USDZ ファイルをドラッグ&ドロップします。

images/5.png

するとこのようにモデルが表示され、右側のパネルに適応されているマテリアルなどが確認できます。

今回はこのベースカラーをいじってみます。ベースカラーを削除すると、ベースカラーがあたっていない灰色の椅子になりました。

images/6.png

次に、このベースカラーにネットから拾ってきた適当なカラフルな geometric な画像をとりあえず当ててみます。

images/7.png

このモデル用の画像ではないので、足のシルバーの部分にも色があたっていますが、簡単にマテリアルを適用させることができますね。

この状態でエクスポートしてみます。右上のエクスポートアイコンから、書き出すを選択するだけです。

images/8.png

簡単ですね。出力された USDZ ファイルを Finder の QuickLook 機能でサクッと確認してみます。簡単にマテリアルを付け替えることができました。

これはあくまで一つの例ですが、Reality Converter を使用すると、簡易的な USDZ ファイルの編集であれば、サクッと行うことができます。

その他、別フォーマットのファイルを USDZ に変換したりなど、Reality Converter には様々な機能が搭載されています。より詳しくは、こちらの公式ページを見てみてください。

USD Tools コマンド解説

ここまでは GUI で 3D モデルを操作する Reality Converter を見ました。次は CUI(コマンド)で USD/USDZ を操作する方法を見てみます。以前はなかったようなのですが、少なくとも、私が使用している 2020 年購入の M1 の MacBookPro には USD を操作するためのコマンドはもともとインストールされていました。

コマンドの詳細はWWDS2024 USD と MaterialX の新機能の中で紹介されていますので、そちらも参考になります。この記事では、参考として実際にコマンドの出力結果を一緒に見ていきます。

一次情報としては Pixar の公式ドキュメントを確認してください。

Blender でデータをエクスポートして、USD Tools のコマンドを使いながら、ファイルの内部構造を見たり編集したりしてみます。

USD Tools 一覧

本記事で検証するコマンドの一覧です。

CommandOperation
usdcatConvert between USD compatible formats or output as text
usdcheckerValidate USD files
usdrecordRender images of USD files
usdtreeOutput the hierarchy of USD files
usdzipCreate USDZ files
usdcrushCompress the contents of USDZ files
usdextractExtract files from within USD compatible packages

USDZ ファイルの準備

まずは一番シンプルな USDZ ファイルを準備します。Blender を立ち上げたときに最初に用意されている立方体を色だけを変更して出力してみます。

images/9.png

今回はこれを obj で出力し、Reality Converter で USDZ に変換してみます。

images/10.png

これで.obj.mtlファイルが出力されるので、これを Reality Converter にドラッグ&ドロップで読み込みます。

Reality Converter 画面右上のエクスポートボタンから書き出すを選択すると、USDZ ファイルが出力されます。

これで USDZ ファイルの準備は完了です。

ここからは、USD Tools のコマンドで先程出力したデータを操作していきます。

1. usdcat

まずは USDZ ファイルの構造がどの様になっているのかを見ていきましょう。

usdcatというコマンドを使用していきます。

Usage: usdcat [OPTIONS] inputFiles…

usdcatは USD ファイルを変換、結合、または内容を出力するコマンドです。以下の用途で使用されます:
▪️ USD ファイルの内容を標準出力に表示する。
▪️ USD ファイルを別のフォーマットに変換する(例: ASCII ⇔ Binary)。
▪️ 複数の USD ファイルを結合して 1 つのファイルにする。

今回sample.usdzというファイル名にしたので、以下のコマンドで、ファイルの中身をテキストデータで人が読める形式にするためにsample.usdaとして出力してみます。

usdcat sample.usdz -o sample.usda
#usda 1.0
(
    customLayerData = {
        dictionary Apple = {
            int preferredIblVersion = 2
        }
        string creator = "usdzconvert preview 0.67"
    }
    defaultPrim = "__"
    metersPerUnit = 0.01
    upAxis = "Y"
)

def Xform "__" (
    assetInfo = {
        string name = "__"
    }
    kind = "component"
)
{
    def Scope "Materials"
    {
        def Material "Material"
        {
            token outputs:surface.connect = </__/Materials/Material/surfaceShader.outputs:surface>

            def Shader "surfaceShader"
            {
                uniform token info:id = "UsdPreviewSurface"
                color3f inputs:diffuseColor = (0.484079, 0.04106, 0.800016)
                token outputs:surface
            }
        }
    }

    def Scope "Geom"
    {
        def Mesh "Cube"
        {
            uniform bool doubleSided = 0
            float3[] extent = [(-1, -1, -1), (1, 1, 1)]
            int[] faceVertexCounts = [4, 4, 4, 4, 4, 4]
            int[] faceVertexIndices = [0, 4, 6, 2, 3, 2, 6, 7, 7, 6, 4, 5, 5, 1, 3, 7, 1, 0, 2, 3, 5, 4, 0, 1]
            rel material:binding = </__/Materials/Material>
            point3f[] points = [(1, 1, -1), (1, -1, -1), (1, 1, 1), (1, -1, 1), (-1, 1, -1), (-1, -1, -1), (-1, 1, 1), (-1, -1, 1)]
            normal3f[] primvars:normals = [(-0, 1, -0), (-0, -0, 1), (-1, -0, -0), (-0, -1, -0), (1, -0, -0), (-0, -0, -1)] (
                interpolation = "faceVarying"
            )
            int[] primvars:normals:indices = [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5]
            texCoord2f[] primvars:st = [(0.625, 0.5), (0.875, 0.5), (0.875, 0.75), (0.625, 0.75), (0.375, 0.75), (0.625, 1), (0.375, 1), (0.375, 0), (0.625, 0), (0.625, 0.25), (0.375, 0.25), (0.125, 0.5), (0.375, 0.5), (0.125, 0.75)] (
                interpolation = "faceVarying"
            )
            int[] primvars:st:indices = [0, 1, 2, 3, 4, 3, 5, 6, 7, 8, 9, 10, 11, 12, 4, 13, 12, 0, 3, 4, 10, 9, 0, 12]
            uniform token subdivisionScheme = "none"
        }
    }
}

ファイル内冒頭に、metersPerUnitupAxisなどの基本的なパラメータが設定されており、def XForm "__"以降にマテリアルやモデルの形などが記載されていることがわかります。

今回はシンプルな Cube で Blender のデフォルトのものですが、実際の複雑なモデルであれば、この部分が膨大なテキストになります。

ファイル内中間あたりに、先程設定した色がcolor3f inputs:diffuseColor = (0.484079, 0.04106, 0.800016)と設定されていることがわかります。

テキストファイルで今回の usdz を開いて、この色部分の数値を変更するとオブジェクトの色が変わります。

2. usdchecker

usdchecker は、USD ファイルの整合性やエラーをチェックするツールです。

Usage: usdchecker [OPTIONS] [inputFile]

usdchecker attempts to validate a USD or usdz file using a series of rules and metrics that will evolve over time. This tool currently provides the best assurance that an asset will be properly interchangeable and renderable by Hydra.

実際に今回のファイルで実行してみます。

 usdchecker sample.usdz
Found material bindings but no MaterialBindingAPI applied on the prim </__/Geom/Cube>. (fails 'MaterialBindingAPIAppliedChecker')
Failed!

マテリアルの紐づけ?がうまくいっていないようですね。。

3. usdrecord

usdrecord は、usd ファイルから画像を生成するツールです。

usdrecord is a command-line utility for generating images (or sequences of images) of a USD stage. Images output by this tool are generated by Hydra and are equivalent to those displayed in the viewer in usdview.

usdrecord sample.usdz sample.png

真正面から見たシンプルな画像が出力されました。様々なオプションが用意されています。

4. usdtree

usdtree は、USD ファイルの階層構造を可視化するためのツールです。

Prints to terminal a unixtree-like summary of a USD layer or composition.

Usage: usdtree [OPTIONS] inputPath

 usdtree sample.usdz
/
 `--__ [def Xform] (kind = component)
     |--Materials [def Scope]
     |   `--Material [def Material]
     |       `--surfaceShader [def Shader]
     `--Geom [def Scope]
         `--Cube [def Mesh]

5. usdzip

usdzip は、USDA ファイルや assets をまとめて USDZ ファイルを作成するツールです。

Utility for creating USDZ packages from USD compositions and the assets (images and others in future) they reference.

今回は先程usdcatで作成し色を変更してみた usda ファイルを単体で、usdzip を使って usdz にしてみます。

usdzip usdz の出力先 USD ファイルパス

usdzip sample2.usdz sample.usda

sample2.usdz が作成され、色の変更も確認できました。

6. usdcrush

usdcrush は、USD ファイルのサイズを最適化するツールです。いい感じに圧縮してくれるようです。

公式ドキュメントに記載がないので、-hで内容を確認してみます。

 usdcrush -h
Reduce the size of the source USD
Usage: usdcrush [OPTIONS] inputFile

Positionals:
  inputFile TEXT REQUIRED     The input file to process

Options:
  -h,--help                   Print this help message and exit
  -o,--out TEXT REQUIRED      The output file to write to
  -t,--textureQuality UINT [75]
                              The quality of the texture to write to (0-100)
  --version                   Display program version information and exit

新たに別ファイルで圧縮されたファイルを作成したり、texture のクオリティを 0-100 で指定できるようですね。

 usdcrush -o sample3.usdz sample.usdz

実行してみたのですがファイルが出力されず。。

なにか間違っているのでしょうか。。。

念の為バージョンを確認しておきます。

 usdcrush --version
Apple USD Tools (0.24.3)

7. usdextract

usdextract は、USDZ を展開して中身を確認できるようにするツールです。

こちらも公式ドキュメントに記載がないので、-hで内容を確認してみます。

 usdextract -h
Extract file(s) from a .usdz or .glb file.
Usage: usdextract [OPTIONS] inputFile

Positionals:
  inputFile TEXT REQUIRED     The input files

Options:
  -h,--help                   Print this help message and exit
  -o,--out directory          Extract the input file to this directory
  --version                   Display program version information and exit

なぜかはわかりませんが、glb ファイルフォーマットにも対応しているようですね。

USDZ の中身の詳細調査などを行いたいとき使うコマンドでしょうか。ただ、.usdzの拡張子を.zipに変更してダブルクリックでも同様のことが可能です。

USD Tools の参考 URL

USD Tools のドキュメントを再掲しておきます。

WWDS2024 USDとMaterialXの新機能


公式ドキュメント

【補足】 USD/USDZ 以外の主な 3D ファイルフォーマット

3D ファイルはスタンダード化されたフォーマットの一つに過ぎず、プロジェクトに依存するさまざまなファイルタイプが存在します。以下は、USD や USDZ 以外の主要な 3D ファイルフォーマットとその特徴を解説します。

1. OBJ (.obj)

OBJ は、最も普及した 3D モデリングファイルフォーマットの一つです。Wavefront Technologies が開発したこのフォーマットは、元の 3D データを表現すことに適しています。

特徴

  • 簡単なテキストファイルで、人間に読みやすい構造。
  • ジオメトリーデータ(諸点のリスト、ポリゴン、ノーマルなど)のサポート。
  • モデルデータをマテリアルと組み合わせるための MTL ファイルとの互換性。

ユースケース

  • ゲーム開発や 3D モデリングソフトで、基本的なモデルの保存に対応。
  • 平均的なレンダラーや 3D ツールでの対応性が高い。

2. FBX (.fbx)

FBX は、Autodesk が提供する高機能な 3D ファイルフォーマットです。主に、アニメーションや複雑な 3D シーンの整備に使用されます。

特徴

  • 複雑なアニメーションデータやスキニングを搭載。
  • 高品質なマテリアルシステムによるサポート。
  • Autodesk のソフトとの位置互換性が高い。

ユースケース

  • プロフェッショナルな 3D シーンのデザイン。
  • ビデオゲームや映画の制作で常用される。

3. STL (.stl)

STL は、スリーティングと呼ばれる格子の 3D モデルに使用される事が多い、基本的なファイルフォーマットです。主に 3D プリンティングのアプリケーションで強力です。

特徴

  • 諸点と面を表現するための構造に限られる。
  • マテリアル情報の貯蔵を搭載しないため、ファイルサイズが小さい。

ユースケース

  • 3D プリンティングのサポート。
  • 基本的なモデルの操作や検証用途に適している。

4. GLTF/GLB (.gltf/.glb)

gltf は、Khronos Group が提供する最新の 3D ファイルフォーマットです。速度や効率を重視した設計がされています。

特徴

  • 高速なロードタイム表示。
  • PBR マテリアルのネイティブサポート。
  • JSON ベースで構造された読みやすいテキスト構造。

ユースケース

  • AR や VR アプリケーション。
  • WebGL ベースの実装に対応。

様々な 3D のファイルフォーマットがありますが、やはり iOS, iPadOS に向けての開発では USDZ を採用しました。上記に述べた USDZ の利点にもありますように、取り扱いやすく、また Apple 製品との互換性もよいという点からです。

その他参考サイト

Working with USD


OpenUSD Github


reincarnation_tech

まとめ

ここまで様々な観点から USDZ ファイルを調査し、実際に触って見ました。やはり単一ファイルなので取り扱いがしやすく、3D 初心者にも易しいです。

また近い内に、USDZ ファイルを用いた iOS/iPadOS での開発について記事にしてみたいと思います。