MayaとUSDZでSceneKit（1）

# はじめに

フリーランスのエンジニア　佐藤です。
95年頃からCG業界に携わってきましたが、現在はUnityやUnrealEngineなどのゲームエンジンを使用したリアルタイムグラフィックスとARをはじめとしたXRコンテンツ、AWS/GCPなどクラウドインフラを中心に活動しています。

[MoAR](https://whatever.co/moar/)では[emoc](https://whatever.co/moar/ja/emoc/)のテクニカルディレクターとして参加させて頂き、[KASSEN](https://kassen.tokyo/)を中心としたCGチームの制作したアセットやアニメーションデータと実装側エンジニアの橋渡しとして、仕様を確認したり検証を担当させて頂きました。

今回は前編として**MayaとUSDZ作業環境の構築**についてまとめており、次回の後編[MayaとUSDZでSceneKit（2）](https://qiita.com/satoy11/private/c68daafba3bc8539cf85)では**トラブルシューティング（Tips）** をまとめています。
<br>

# 作業環境
MoARのARコンテンツはiOSネイティブアプリ（App Clip対応）でAppleのSceneKitで描画することになったので、Xcodeとのやりとりが多くなることが予想されるためMacbook Pro 14（2021）を使用することにしました。

<!-- <img src="sample.png" width=450 />　-->
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58040/d26ba3f3-d777-0a12-00c9-d25e654d4ccb.png" width=600 />

---
## Maya
https://area.autodesk.jp/product/maya/

モデルやアニメーションなどCGデータを制作するDCCツールはいつものMayaですが、納品形式がUSDZ形式になったのでUSD関連機能が比較的最近搭載されている事を考慮して作業時の最新版だったMaya 2023.1とUSD for Maya 0.19.0プラグインを使用してUSDZファイルをエキスポートしています。

## Autodesk MayaUSD GitHub repository
https://github.com/Autodesk/maya-usd

USD for Maya 0.19.0を使用していましたが、現在は0.20.0までリリースされています


|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58040/41b821d1-15b0-1ae8-62fb-926261c3716f.png" width="800" />|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58040/84d93f6c-26b9-d891-3aa8-fca7cf7989c8.png" width="300" />|
|:-:|:-:|

#### エキスポートのオプションについての補足

**.usd File Format**
テクスチャーも含めて１つのファイルにまとめたUSDZファイルを使用しています。
エキスポートするファイル名の拡張子は手動でファイルネーム.usdzと記入する必要があります。

**Blend Shapes**
ブレンドシェイプアニメーションが必要だった場合はチェック

**Visibility**
チェックするとMaya上で設定した表示/非表示はusdviewでは確認出来ますが、Xcode上では再現出来ません。

**Merge Transform and Shape Nodes**
TransformノードとShapeノードのDAG階層をまとめて１つのノードにする場合はチェック
今回はブレンドシェイプの扱いに注意が必要だったのでチェックを外してます。

**Include Namespaces**
Mayaのネームスペースを出力するとノード名が長くなるのと、Xcode側の対応状況が怪しかったのでチェックを外してます。
ネームスペースを使用した場合はemoc_S:foot_Lといった命名規則になりますが、このままネームスペースを外すとfoot_Lとノード名が他のキャラと被ってしまうので、emoc_S_foot_Lのようにプレフィックスを使用してユニークなノード名となるようにしています。

大量にある場合はコマンドラインからバッチ処理で出力することも出来ますが、今回は1つのファイルにまとめるのでGUIからエキスポートしています。

<br>

---
## USD Toolset
https://github.com/PixarAnimationStudios/USD

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58040/3b0c90d7-0802-32ad-92f2-867933266809.png" width=600 />

USDのリポジトリにはusdviewをはじめUSD関連の便利なツールが含まれています。
22.08を使用していましたが、現在は22.11までリリースされています

次の２つの理由でusdviewで事前にプレビューするようになりました。
　● Xcodeでは再生と停止だけで途中から再生したり出来ないのでシーン制作が進むとアニメーションの再生確認が辛くなった
　● USDZファイルをMayaからエキスポートした時か、Xcodeにインポートした時の問題か切り分けが必要になった

Python環境の構築とM1 Macにインストールするのに特殊なオプションが必要だったので、[USD Toolsetのセットアップ（M1 Mac用）](https://qiita.com/satoy11/private/54d17788764bec1d563b#usd-toolset%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97m1-mac%E7%94%A8)として下記にまとめてあります。
<br>

---
## Xcode 14
https://developer.apple.com/jp/xcode/

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58040/5fa0d9e2-8bd8-d640-92a6-5c85aec4cc55.png" width=600 />

最終的にXcode上にインポートされたUSDZファイルをSceneKit Scene Editorで確認します。
特にコードを書かなくても描画やアニメーションを確認出来ますが、前述の問題により後半からはusdviewで事前にプレビューしています。

---
## USD Toolsetのセットアップ（M1 Mac用）

USD ToolsetはWindowsやLinuxだけでなくMacにも対応していますが、今回使用したMacbook Pro 14(2021)はApple SiliconのM1プロセッサーを搭載しているため一工夫必要でした。

参考にしたインストール方法はこちらになります。
https://rhonabwy.com/2022/08/16/native-support-for-usd-tools-on-an-m1-mac/


まずPython環境についてはMac OS 12.3 Montereyからpython2.7が削除されたりと色々と面倒なことになっています。
Python2.x系と3.x系の互換性問題とライブラリの依存関係を考慮しないpipコマンドの組み合わせはカオスな上に、各ソフト毎に必要なPythonとライブラリのバージョンが異なる場合が多く、ローカルインストールしたPython環境で対応するのが難しくなっています。

という事で今回は目的別にPython環境を切り替えて使い分けられるようにMiniconda(Anacondaの軽量版)を使ってPython仮想環境を用意しています。

#### MinicondaのGitHubからarm64 (Apple Silicon) 用のインストーラー（Shell Script）をダウンロード

ブラウザでhttps://github.com/conda-forge/miniforge から Miniforge3-MacOSX-arm64.sh をダウンロード
もしくはターミナルからwgetやcurlでダウンロードしても構いません
```
$ wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh
```
<br>

#### ターミナルを開きMinicondaをセットアップ

```
$ sh ~/Downloads/Miniforge3-MacOSX-arm64.sh     #ダウンロードフォルダーにダウンロードした場合
```

インストーラーを実行すると、enterの入力とライセンスの承諾、Minicondaのインストール先の入力が求められますので適時対応します。
<br>

#### Minicondaのインストール完了後、condaコマンドでPython仮想環境を作成
```
$ source /opt/miniforge3/bin/activate    #condaを有効にして動作確認します
(base)$ conda deactivate    #プロンプトに(base)と出ればOK、condaを終了して元に戻ります

$ conda update conda -y     #conda自体をアップデートする
$ conda update --all        #パッケージをアップデートする
$ conda create -n USD       #今回の作業用のPython仮想環境を作成する
$ conda activate USD        #作成したPython仮想環境を有効にする
(USD)$                      #プロンプトが切替わればOK
```

**（補足）作業当時に使用していたOSとPythonのバージョン**
　● MacOS  12.6
　● Python  3.10.6.final.0

#### USD Toolsetに必要なライブラリを追加
```
(USD)$ conda install pyopengl
(USD)$ pip install pyside6 
```

#### PixarのGitHubからcloneしてビルドする
```
(USD)$ git clone https://github.com/PixarAnimationStudios/USD
(USD)$ cd USD
(USD)$ git checkout release
(USD)$ git pull
(USD)$ python build_scripts/build_usd.py /opt/USD --build-args USD,"-DPXR_PY_UNDEFINED_DYNAMIC_LOOKUP=ON"

Building with settings:
  USD source directory          /Users/satoy11/build/USD
  USD install directory         /opt/USD
  3rd-party source directory    /Users/satoy11/USD/src
  3rd-party install directory   /opt/USD
  Build directory               /Users/satoy11/USD/build
  CMake generator               Default
  CMake toolset                 Default
  Downloader                    curl

  Building                      Shared libraries
    Variant                     Release
    Imaging                     On
      Ptex support:             Off
      OpenVDB support:          Off
      OpenImageIO support:      Off 
      OpenColorIO support:      Off 
      PRMan support:            Off
    UsdImaging                  On
      usdview:                  On
    Python support              On
      Python Debug:             Off
      Python 3:                 On
    Documentation               Off
    Tests                       Off
    Examples                    On
    Tutorials                   On
    Tools                       On
    Alembic Plugin              Off
      HDF5 support:             Off
    Draco Plugin                Off
    MaterialX Plugin            Off

  Dependencies                  zlib, boost, TBB, OpenSubdiv
  Build arguments               USD: -DPXR_PY_UNDEFINED_DYNAMIC_LOOKUP=ON
STATUS: Installing zlib...
STATUS: Installing boost...
STATUS: Installing TBB...
STATUS: Installing OpenSubdiv...
STATUS: Installing USD...

Success! To use USD, please ensure that you have:

    The following in your PYTHONPATH environment variable:
    /opt/USD/lib/python

    The following in your PATH environment variable:
    /opt/USD/bin
```

最後の行で`--build-args USD,"-DPXR_PY_UNDEFINED_DYNAMIC_LOOKUP=ON"`とあるのがM1 Macにインストールする場合の注意点となります。


#### 環境変数を登録する
```
# .zshrc
source  /opt/miniforge3/bin/activate
export PATH=/opt/USD/bin:$PATH
export PYTHONPATH=$PYTHONPATH:/opt/USD/lib/python
```
*ここではzshを使用した場合の例となりますが、シェルの設定ファイルに環境変数を登録します。*

#### usdviewの実行
```
(USD)$ usdview <File Name>.usdz
```
souceするか、シェルを立ち上げなおしてからUSD Toolsetのコマンドが起動すれば完了です。


***USD Toolsetにはusdviewの他にもusdcatやusdzip、usdcheckerなどの便利なコマンドが揃っています。***

---
## 次回は…
**次回は[MayaとUSDZでSceneKit（2）](https://qiita.com/satoy11/private/c68daafba3bc8539cf85)でトラブルシューティング（Tips）などまとめています。**