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은 유효한 glTF여야 합니다.

PITM에는 단일 장면이 있습니다. 또한 buffer URI와 같은 외부 리소스 참조를 사용할 수 없습니다. (모든 텍스처, 메쉬 등의 데이터는 GLB 파일 내에 완전히 포함되어야 합니다)

glTF의 최상위 레벨에는 ClusterItem extension이 필요하며, 각 노드에는 ClusterItemNode extension이 필요합니다.

PITM의 기본 구조는 크래프트 아이템과 액세서리의 경우에 동일하지만 각각에서 사용할 수 있는 기능이 다릅니다.

크래프트 아이템

크래프트 아이템 제한을 따릅니다. pbrMetallicRoughness와 같은 glTF 표준 머티리얼을 사용할 수 있습니다.

액세서리

액세서리 제한을 따릅니다.

Item에서는 Item.metaItem.accessory_item만 사용할 수 있으며, 이 두 필드는 필수입니다. ItemNode의 필드는 액세서리에서 사용할 수 없지만, 빈 ItemNode가 필요합니다.

머티리얼에는 MToon만 사용할 수 있습니다. MToon 매개변수는 glTF 자료의 ClusterVRM0MToon extra에 기술됩니다.

ClusterItem extension 및 ClusterItemNode extension

최상위 레벨에는 ClusterItem extension이 필요합니다.

"extensions": [
    "ClusterItem": {
      {"item": "URL-safe base64로 인코딩된 message Item"}
    }
]

모든 노드에는 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": {...}
      }
    }
  }
}