PITMデータ形式

PITMはglTF-2.0と独自のextensions, extrasの組み合わせです。PITMはGLBコンテナ形式でシリアライズされます。extensionsの仕様はProtocol Buffersで記述されています。

PITMの一部仕様を用いてクラフトアイテムやアクセサリーを書き出すためのユーティリティクラスがPythonサンプルコードに含まれています。以下のファイルをご覧ください。

https://github.com/ClusterVR/PITMSample/blob/main/python/pitm.py

glTF構造

PITMはvalidなglTFである必要があります。

PITMは単一のsceneを持ちます。また、bufferのuriなど、外部リソースの参照は利用できません。(全てのテクスチャ、メッシュなどのデータはGLBファイル内で完結して含まれている必要があります)

glTFのトップレベルにClusterItem extensionが、各nodeにClusterItemNode extensionが必要です。

PITMの基本構造はクラフトアイテムとアクセサリーの場合で同じですが、それぞれで利用出来る機能が異なります。

クラフトアイテム

クラフトアイテムの制限に従います。pbrMetallicRoughnessなどglTFの標準マテリアルが利用可能です。

アクセサリー

アクセサリーの制限に従います。

ItemではItem.metaItem.accessory_itemのみ利用でき、これら二つのフィールドは必須です。 ItemNode内のフィールドはアクセサリーでは利用出来ませんが、空のItemNodeが必要です。

マテリアルにはMToonのみ利用出来ます。MToonのパラメーターはglTFのmaterialのClusterVRM0MToon extraに記述されます。

ClusterItem extension と ClusterItemNode extension

トップレベルにはClusterItem extensionが必要です。

"extensions": [
    "ClusterItem": {
      {"item": "URL-safe base64エンコードされたmessage Item"}
    }
]

全てのnodeにはClusterItemNode extensionが必要です。

"extensions": [
    "ClusterItemNode": {
      {"itemNode": "URL-safe base64エンコードされたmessage ItemNode"}
    }
]

ItemとItemNodeの仕様はproto3で記述されています。以下のファイルをご覧ください。

https://github.com/ClusterVR/PITMSample/blob/main/pitm.proto

URL-safe base64エンコーディングには、RFC 4648の Base 64 Encoding with URL and Filename Safe Alphabetの亜種を利用します。

  • 末尾の=はありません
  • +/の代わりに-_を使用します

例: URL-safe base64エンコードされたItemNode “OiQKIgogCg4KDAAAAAAAAAAAmpmZPRIOCgwAAAA_AAAAP5qZGT4”

ClusterVRM0MToon extra

PITM内でMToonはglTFのmaterialのextrasにClusterVRM0MToonとして格納されます。

MToonMat内のデータはVRM-0.xのmaterialPropertiesの各要素と同様の形式に従います。

{
  ..., // materialのその他の中身
  "extras": {
    "ClusterVRM0MToon": {
      "MToonMat": {
        "shader": "VRM/MToon",
        "renderQueue": {...},
        "keywordMap": {...},
        "tagMap": {...},
        "floatProperties": {...},
        "textureProperties": {...},
        "vectorProperties": {...}
      }
    }
  }
}