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ファイルをクリーンアップできました。