[Omniverse] USD ComposerでUSDの構文チェック (Asset Validator)

  • by

Omniverse USD Composer 2023.1.1 Betaで確認しています。
USD Composerでは「Asset Validator」という機能が追加されました。

ドキュメントは以下をご参照くださいませ。
https://docs.omniverse.nvidia.com/extensions/latest/ext_asset-validator.html

今回はこの機能を使って、USDファイルで構文ミスがないかチェックします。

旧Omniverse Create(-2022.3.3)からUSD Composer 2023.1.1にかけて、
使用しているUSDやPythonが大きくバージョンアップされました。
[Omniverse] USD Composer 2023.1.1 Betaでの変更点」もご参照くださいませ。

モジュール Omniverse Create 2022.3.3 USD Composer 2023.1.1 Beta
Omniverse Kit 104 105
Python 3.7 3.10
USD 20.08 22.11

USDがバージョンアップされたことにより、20.08で使えていたUSDのAPIが22.11で廃止されていたり、または追加されたり、少なからず変更が発生していました。
特に、LightやPhysics、メッシュのprimvarの指定(UVなど)あたりは開発の際は注意する必要があります。

Asset Validatorの使い方

USD Composerで対象のusdファイルを開きます。

注意点として、"Stage Lights"を選択するようにしてください。

それ以外のプリセットはStageに独自のライトを加えるため、それが検出されてしまいます。

メインメニューの[Windows]-[Utilities]-[Asset Validator]を選択します。
Asset Validatorウィンドウが表示されます。
左下の"Analyze"ボタンを押すと解析を開始します。

白い三角をクリックすると、チェック項目が階層表示されます。

ここで表示されるチェック項目はusdファイルの内容により異なります。
この表示がゼロになるのを目指せばよいことになります。

Asset 説明
UsdLuxSchemaChecker ライトの情報
UsdMaterialBindingApi マテリアルのバインド
StageMetaDataChecker ステージの情報
ExtentsChecker Primを囲むバウンディングボックス
TypeChecker Primの種類
UsdAsciiPerformanceChecker usdaだと大きなデータがあるとエラーとして検出される

"UsdAsciiPerformanceChecker"はusdaの場合に表示されるので、無視してよいと思います。

"TypeChecker"、Missing typeに何も入ってなかったです。無視します。

"UsdLuxSchemaChecker"、これはライトのチェックです。
何を修正したほうがいいか、ヒントが表示されています。

usdaファイルで見た場合、修正前は以下。

def DistantLight "DistantLight" (
    prepend apiSchemas = ["ShapingAPI"]
)
{
    float angle = 1
    float intensity = 3000
    float shaping:cone:angle = 180
    float shaping:cone:softness
    float shaping:focus
    color3f shaping:focusTint
    asset shaping:ies:file
    double3 xformOp:rotateXYZ = (315, 0, 0)
    double3 xformOp:scale = (1, 1, 1)
    double3 xformOp:translate = (0, 9.903866480068238, 7.834354909070436)
    uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ", "xformOp:scale"]
}

ライトのパラメータは、USDの22.11(もう少し前のバージョンからからかもしれない)では"inputs:"を付ける仕様に変更されました。
以下のように変更します。

def DistantLight "DistantLight" (
    prepend apiSchemas = ["ShapingAPI"]
)
{
    float inputs:angle = 1
    float inputs:intensity = 3000
    float inputs:shaping:cone:angle = 180
    float inputs:shaping:cone:softness
    float inputs:shaping:focus
    color3f inputs:shaping:focusTint
    asset inputs:shaping:ies:file
    double3 xformOp:rotateXYZ = (315, 0, 0)
    double3 xformOp:scale = (1, 1, 1)
    double3 xformOp:translate = (0, 9.903866480068238, 7.834354909070436)
    uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ", "xformOp:scale"]
}

この変更を行ってから再度usdファイルを開いてAsset Validatorで検証すると、このエラーが消えました。

Asset Validatorウィンドウで自動修正する方法もあるので、これは後述します。

"UsdMaterialBindingApi"、これはMaterialBindingApiのスキーマを使ってないという警告です。

usdaファイルで見た場合、修正前は以下。

def Mesh "cyawan"
{
    int[] faceVertexCounts = ...
}

ここで、自動修正を行ってみましょう。
修正する項目のチェックボックスをチェックし、中央下の"Fix errors on Selected"ボタンを押します。
これは開いているusdファイル自身を上書きするので注意してください。

usdaファイルを開くと以下のようになりました。

def Mesh "cyawan" (
    prepend apiSchemas = ["MaterialBindingAPI"]
)
{
    int[] faceVertexCounts = ...
}

"StageMetaDataChecker"、これはusdのヘッダ部にあるステージ情報のチェック項目です。

metersPerUnitやUpAxisは明示指定する仕様を推奨するようです。

usdaファイルで見た場合、修正前は以下。

#usda 1.0
(
    customLayerData = {
    }
    defaultPrim = "root"
    endTimeCode = 300
    framesPerSecond = 30
    startTimeCode = 0
}

これは"Fix errors on Selected"ボタンでは修正できなかったので手動でmetersPerUnitとupAxisの2行を追加しました。

#usda 1.0
(
    customLayerData = {
    }
    defaultPrim = "root"
    endTimeCode = 300
    framesPerSecond = 30
    startTimeCode = 0
    metersPerUnit = 0.01
    upAxis = "Y"
}

残りは"ExtentsChecker"、Primを囲むローカルのバウンディングボックスを表すextentは
明示指定する仕様を推奨するようです。

Meshなどのジオメトリの場合は、"Fix errors on Selected"ボタンで修正できました。
usdaファイルは以下のようにextentが追加されました。

def Mesh "cyawan" (
    prepend apiSchemas = ["MaterialBindingAPI"]
)
{
    float3[] extent = [(-6.1475153, 0, -6.1364236), (6.1475153, 6.8, 6.1364236)]
}

なお、ライトについてもSphereLightやCylinderLightなどの形状を持つ場合に、
extentの指定が必要のようでした。

残りは無視した"TypeChecker"と"UsdAsciiPerformanceChecker"だけになりました。

これでusdファイルをクリーンアップできました。