🦁

USDをビルドしusdzツールのUSDを最新にする

2024/09/19に公開

今回最終的に利用した usdPyhon は以下に格納しています。
https://github.com/activeguilde/USDpython

はじめに

  • Appleが提供している usdPythonのpythonのバージョンが3.7.9で止まっているのでOpenUSDで利用可能な最新のpythonのバージョンでUSDをビルドして利用する

利用可能なPythonのバージョンはここから確認できます。

Step1 ビルド前準備

  • 3.7.9のpythonを利用していたので、pyenv でOpenUSDがサポートしているバージョンをインストールする
pyenv install 3.9.13
pyenv local 3.9.13

python で、python3 を実行できるようにもしておきたいので、以下も実行

alias python="python3"
  • USDの中にある、 usdView コマンドで、 pyside6 を利用しているのでインストールする
  • pyside2` でもOK
python -m pip install pyside6

Step2 ビルドする

  • 不要なものはoptionでのぞく
    (ビルドに時間がかかるので辛抱する)
python USD/build_scripts/build_usd.py /path/to/my_usd_install_dir --no-examples --no-tests --no-docs --no-ptex --no-openvdb --no-draco --no-materialx --no-examples

ビルドエラー対処

  • 以下のエラーが出る為、pyOpenGL をインストールする
PyOpenGL is not installed. If you have pip installed, run "pip install PyOpenGL" to install it, then re-run this script.
If PyOpenGL is already installed, you may need to update your PYTHONPATH to indicate where it is located.
pip install PyOpenGL
成功時のビルドログ

Building with settings:
USD source directory /Users/xxxxxx/projects/OpenUSD
USD install directory /Users/xxxxxx/projects/OpenUSD/dist
3rd-party source directory /Users/xxxxxx/projects/OpenUSD/dist/src
3rd-party install directory /Users/xxxxxx/projects/OpenUSD/dist
Build directory /Users/xxxxxx/projects/OpenUSD/dist/build
CMake generator Default
CMake toolset Default
Downloader curl

Building Shared libraries
Variant Release
Target native
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 docs: Off
Documentation Off
Tests Off
Examples On
Tutorials On
Tools On
Alembic Plugin Off
HDF5 support: Off
Draco Plugin Off
MaterialX Plugin On

Dependencies zlib, boost, TBB, MaterialX, OpenSubdiv
STATUS: Installing zlib...
STATUS: Installing boost...

STATUS: Installing TBB...
STATUS: Installing MaterialX...
STATUS: Installing OpenSubdiv...
STATUS: Installing USD...

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

The following in your PYTHONPATH environment variable:
/Users/xxxxxx/projects/OpenUSD/dist/lib/python

The following in your PATH environment variable:
/Users/xxxxxx/projects/OpenUSD/dist/bin

Step3 置換

  • USD/ 配下を置き換える
    置き換えたあとはこちらを参照

Setp4 usdzconvertを実行

usdzconvert ./cube.glb ~/cube.usdz

エラーが出る

Input file: /Users/xxxxxx/Documents/cube.glb
Traceback (most recent call last):
  File "/Users/xxxxxx/projects/USDPython/./usdzconvert/usdzconvert", line 860, in <module>
    errorValue = main()
  File "/Users/xxxxxx/projects/USDPython/./usdzconvert/usdzconvert", line 855, in main
    return tryProcess(sys.argv[1:])
  File "/Users/xxxxxx/projects/USDPython/./usdzconvert/usdzconvert", line 810, in tryProcess
    ret = process(argumentList)
  File "/Users/xxxxxx/projects/USDPython/./usdzconvert/usdzconvert", line 650, in process
    usdStage = usdStageWithGlTF_module.usdStageWithGlTF(srcPath, tmpPath, legacyModifier, openParameters)
  File "/Users/xxxxxx/projects/USDPython/usdzconvert/usdStageWithGlTF.py", line 1529, in usdStageWithGlTF
    return converter.makeUsdStage()
  File "/Users/xxxxxx/projects/USDPython/usdzconvert/usdStageWithGlTF.py", line 1512, in makeUsdStage
    self.processNodeChildren(self.gltf['scenes'][0]['nodes'], self.asset.getGeomPath(), None)
  File "/Users/xxxxxx/projects/USDPython/usdzconvert/usdStageWithGlTF.py", line 1399, in processNodeChildren
    self.processNode(nodeIdx, path, underSkeleton, indent)
  File "/Users/xxxxxx/projects/USDPython/usdzconvert/usdStageWithGlTF.py", line 1366, in processNode
    usdGeom = self.processMesh(nodeIdx, newPath, underSkeleton)
  File "/Users/xxxxxx/projects/USDPython/usdzconvert/usdStageWithGlTF.py", line 1316, in processMesh
    usdGeom = self.processPrimitive(nodeIdx, gltfPrimitives[0], path, skinIdx, underSkeleton)
  File "/Users/xxxxxx/projects/USDPython/usdzconvert/usdStageWithGlTF.py", line 1142, in processPrimitive
    normalPrimvar = usdGeom.CreatePrimvar('normals', Sdf.ValueTypeNames.Normal3fArray, UsdGeom.Tokens.vertex)
AttributeError: 'Mesh' object has no attribute 'CreatePrimvar'

issueを確認して usdzconvert/usdStageWithGlTF.py を修正
https://github.com/PixarAnimationStudios/OpenUSD/issues/2628

elif key == 'NORMAL':
- normalPrimvar = usdGeom.CreatePrimvar('normals', Sdf.ValueTypeNames.Normal3fArray, UsdGeom.Tokens.vertex)
+ primvar_api = UsdGeom.PrimvarsAPI(usdGeom.GetPrim())
+ normalPrimvar = primvar_api.CreatePrimvar("normals", Sdf.ValueTypeNames.Normal3fArray, UsdGeom.Tokens.vertex)
                normalPrimvar.Set(accessor.data)
primvarName = 'st' if texCoordSet == '0' else 'st' + texCoordSet
- uvs = usdGeom.CreatePrimvar(primvarName, + Sdf.ValueTypeNames.TexCoord2fArray, UsdGeom.Tokens.vertex)
+ primvar_api = UsdGeom.PrimvarsAPI(usdGeom.GetPrim())
+ uvs = primvar_api.CreatePrimvar(primvarName, Sdf.ValueTypeNames.TexCoord2fArray, UsdGeom.Tokens.vertex)
uvs.Set(newData)

上記修正で、 usdzconverter が正常に終了することを確認。

  • ただ以下のエラーが出てる(そもそもglbファイルの作りが良くありませんでした。)
Input file: /Users/xxxxxx/Documents/cube.glb
Output file: /Users/xxxxxx/Documents/cube.usdz
MaterialBindingAPIAppliedChecker
usdARKitChecker: [Fail] /Users/xxxxxx/Documents/cube.usdz

Discussion