Schemaについて
Universal Scene Description 7 日目は、Schema(スキーマ)についてです。
Schema とは
USD defines a schema as an object whose purpose is to author and retrieve structured data from some UsdObject. 引用: https://graphics.pixar.com/usd/release/glossary.html#usdglossary-schema
とあるとおり、あるUsdObject(Prim)に対して共通の機能・特性を指定するものです。
たとえば、UsdGeomMesh なら、この Prim には Mesh を作るのに必要な Property が定義されているから 表示するツールは Mesh として扱っていいよ この UsdGeomXform なら、これはいわゆる TransformNode だからそのつもりで扱っていいよ というような、各 Prim に対して役割(構造)を与えます。
当然、DCC ツールからデータを Export する時には、Prim に対しては Schema が定義されています。 そのため、Schema やその分類については意識しなくても大丈夫ですが、 Python 等で USD を操作しようとした場合はその限りではありません。
stage.DefinePrim('/hogehoge')
たとえば、このように UsdStage から DefinePrim した場合。 構造化されていない野良データになります。
その場合、ツールによっては Type の解釈がうまくいかなくて問題になったりするので Schema は定義するようにしましょう。
Schema の種類
なんとなく Schema がどんなものか理解できてきたとおもいますが、 Schema と一言で言っても、様々な種類があります。
分類すると、このようになります。
多くの場合 は Prim Schema と呼ばれる Prim に対して指定する Schema ですが この PrimSchema も、役割や対象によって細かくいくつかの種類に分かれます。 さらに理解を深めるために、分類について見ていきます。
Prim Schema
PrimSchema は、その名の通り Prim に対して指定される Schema のことを指します。 多くの場合、Schema はこの PrimSchema です。
# 野良Primを作った場合
stage.DefinePrim("/noraPrim")
最初に説明した通り、UsdStage から DefinePrim した場合は、Schema の定義されていない空の野良 Prim になります。 この Prim に対して Type(Prim Schema)を指定します。
作成するには、各 Schema のクラスの Define から Prim 作成を実行します。 すると、指定された Schema で Prim を定義することができます。
例として、Cube を作成したい場合。
stage = Usd.Stage.CreateInMemory()
geom = UsdGeom.Cube.Define(stage,'/sample')
print(stage.ExportToString())
このように UsdGeomCubeを Defineすると、 Prim は指定した Schema の Prim(UsdGeomCube)になります。