USD 入門編３：macOS Sierra で USD を試してみる

これは Pixar USD http://openusd.org に関する情報です。

前回の記事: [USD (2016/8 版) をビルドしてみる] (http://qiita.com/takahito-tejima/items/28c3ba624023f5154479)

前回は windows で USD をビルドしてみましたが、依存ライブラリも多く現状はなかなか大変でした。実は USD の機能をものすごく簡単に試してみる方法があります。それは macOS Sierra を使うことです。

macOS Sierra の Model I/O Framework にはなんと USD インポートが追加されています。何もインストールする必要はありません（XCodeはあったほうが便利です）。では早速試して見ましょう。

適当なテキストエディタで、次のようなファイルを書いて見てください。

```cube.usda
#usda 1.0

def Cube "Cube"
{
}
```
すると、ファインダーにこのように現れます。
<img width="442" alt="ss1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/64544/f8d03081-f521-2fac-029b-6fa785ee84bc.jpeg">
さらにこのファイルを選んでスペースキーを押すと、QuickLook が起動して、モデルビューワとして使うことができます。
<img width="803" alt="ss2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/64544/5b665ae2-1611-5cc4-b7d7-1de345f8d82f.jpeg">

めちゃくちゃ簡単ですね。メッシュも同様に、

```mesh.usda
#usda 1.0
def Mesh "Mesh"
{
    int[] faceVertexCounts = [4,4,4,4]
    int[] faceVertexIndices = [0,1,4,3,1,2,5,4,3,4,7,6,4,5,8,7]
    Vec3f[] points = [(0,0,0),(1,0.5,0),(2,0,0),
                      (0,0,-1),(1,0.3,-1),(2,0,-1),
                      (0,0.2,-2),(1,0,-2),(2,0,-2)]
}
```
<img width="564" alt="ss3.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/64544/3ffcdbf3-c244-ca22-acbc-f0fc93e71dee.jpeg">

できました。

さて obj ファイルなどとの決定的な違いは、usd を使ってコンポジションができることにあります。早速試してみましょう。上で作った cube.usda ファイルを、別のファイルからリファレンスしてみます。

```reference.usda
#usda 1.0
over "RefCube"
( add references=@cube.usda@</Cube> )
{
}
```

今度は QuickLook ではなくて、reference.usda をダブルクリックしてプレビューを使ってください。現状ではQuickLook は別のファイルを読みに行けないようです。プレビュー内では、上の cube.usda と同じ立方体が表示されるはずです。

<img width="577" alt="ss4.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/64544/b0d64c38-05f0-ac65-28cb-5736343c693e.jpeg">

reference.usda を次のように編集してみます。

```reference.usda
#usda 1.0

over "RefCube"
( add references=@cube.usda@</Cube> )
{
}

over "RefCube2"
( add references=@cube.usda@</Cube> )
{
   token[] xformOpOrder = [ "xformOp:translate" ]
   Vec3f xformOp:translate = (-3, 0, 0)
}

over "RefCube3"
( add references=@cube.usda@</Cube> )
{
   token[] xformOpOrder = [ "xformOp:translate" ]
   Vec3f xformOp:translate = (3, 0, 0)
}
```

このファイルをダブルクリックでプレビューで開くと、３つのキューブが出て来ます。
<img width="549" alt="ss5.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/64544/5ec772c0-1cf5-1c79-4539-7b955eb2f5a2.jpeg">

最初の RefCube のリファレンス先を、上で作った mesh.usda にしてみましょう。</Mesh> も忘れずに。

```reference.usda
#usda 1.0

over "RefCube"
( add references=@mesh.usda@</Mesh> )
{
}

over "RefCube2"
( add references=@cube.usda@</Cube> )
{
   token[] xformOpOrder = [ "xformOp:translate" ]
   Vec3f xformOp:translate = (-3, 0, 0)
}

over "RefCube3"
( add references=@cube.usda@</Cube> )
{
   token[] xformOpOrder = [ "xformOp:translate" ]
   Vec3f xformOp:translate = (3, 0, 0)
}
```
<img width="546" alt="ss6.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/64544/f32cb1d4-3605-c139-f9c6-41c2672e9bee.jpeg">

ここまで、テキストエディタとプレビューを使って、USD のコンポジションのごく初歩を見て来ました。これ以外にも継承、バリアント、インスタンスなど、USD のコンポジション機能はまだまだありますが、パイプライン開発に関わる方であればここまでの例をみてピンとくる方もいらっしゃるでしょう。

cube.usda や mesh.usda と reference.usda はまったく独立に編集することが可能で、かつ、reference.usda は具体的な型（Cube, Mesh)がないのに、コンポジションの結果 RefCube2 は Cube に translate の意見（＝オピニオン）がついたデータとして扱われます。これが多人数での同時編集を可能にする、非破壊シーングラフの強力な機能です。

最後に、scene kit 経由で usda が読み込めるため、Xcode で SceneKit アプリを作って、上の reference.usda ファイルを読み込めば、このようにアプリとして組み込むことも瞬時に可能です。

<img width="595" alt="ss7.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/64544/8e3d1168-1587-b07c-1595-c829503658f3.jpeg">

USD 自体がまだベータバージョンのため、シェーディングなどの対応が不完全ですが、VFX スタジオだけでなく Apple も力を入れて USD 対応を進めているのがわかるかと思います。Sierra　にアップグレードした際にはぜひ試してみてください。