VGO 2.0 のデータ スキーマの解説

# 2. データ スキーマ

このページではVGO 2.0 の データ スキーマの詳細を説明します。

## 目次

- [全体目次] (https://qiita.com/izayoijiichan/items/5c7004cd87fe31a08414)
  - [1. ファイル仕様] (https://qiita.com/izayoijiichan/items/f25acc93cf3a7c46c4bb)
  - 2. データ スキーマ（現在位置）

## 2. データ スキーマ仕様

VGO 2.0 では 一部のデータを`JSON`または`BSON`として格納しています。

対象のデータは以下の通りです。

|名前|補足|
|:--|:--|:--:|
|アセット情報||
|レイアウト情報||
|リソース アクセサー||
|リソース|チャンクタイプが`REPJ`または`REPB`の場合のみ|


## 2-1. アセット情報 (vgo.assetInfo)

VGOのアセット情報を格納しています。

|定義名|説明|データ タイプ|必須|
|:---|:---|:---|:---:|
|generator|このVGOモデルの生成ツールの情報|vgo.generatorInfo||
|right|このVGOのコピーライト。|vgo.right||
|extensions|拡張定義。|object||
|extensionsUsed|このアセットで使用されている拡張定義の名前（レイアウトを含む）|string[]||


### ジェネレーター情報 (vgo.generatorInfo)

|定義名|説明|データ タイプ|必須|値|
|:---|:---|:---:|:---:|:---|
|name|生成ツールの名前。|string|true|UniVGO|
|version|生成ツールのバージョン。|string|true|2.0.0|

ジェネレーターがVGOファイルをエクスポートする際に設定します。


### 権利情報 (vgo.right)

このVGOモデルに対するコピーライト&copy;です。

|定義名|説明|データ タイプ|必須|補足|
|:---|:---|:---:|:---:|:---|
|title|このワークのタイトル。|string|||
|author|クリエイターの名前。|string|||
|organization|クリエイターの所属する組織。|string|||
|createdDate|このワークの作成日。|string||指定のフォーマットはありません。|
|updatedDate|このワークの更新日。|string||指定のフォーマットはありません。|
|version|このワークのバージョン。|string||指定のフォーマットはありません。|
|distributionUrl|配布URL。|string||URLフォーマット|
|licenseUrl|ライセンスを記載したURL。|string||URLフォーマット|


### アセット情報（例）

```json:assetInfo.json
{
    "generator": {
        "name": "UniVGO",
        "version": "2.0.0"
    },
    "right": {
        "title": "Sample 3D Model",
        "author": "Izayoi Jiichan",
        "organization": "",
        "createdDate": "2020-08-20",
        "updatedDate": "2020-08-20",
        "version": "1.0.0",
        "distributionUrl": "",
        "licenseUrl": ""
    },
    "extensions": [],
    "extensionsUsed": []
}
```

## 2-2. レイアウト

VGOのレイアウト情報です。

|定義名|説明|データ タイプ|必須|補足|
|:---|:---|:---|:---:|:---|
|nodes|ノードの一覧です。|layout.node[]|true|ノードの先頭にはルートを含めます。|
|skins|スキンの一覧です。|layout.skin[]|||
|meshes|メッシュの一覧です。|layout.mesh[]|||
|materials|マテリアルの一覧です。|layout.material[]|||
|textures|テクスチャーの一覧です。|layout.texture[]|||
|particles|パーティクルの一覧です。|layout.particle[]|||
|extensions|拡張定義。|object|||


### ノード (layout.node)

ノード ヒエラルキーのノードです。

|定義名|説明|データ タイプ|必須|設定値|既定値|
|:---|:---|:---|:---:|:---:|:---:|
|name|このノードの名前です。|string|true|||
|isRoot|ノードがルートかどうか。|bool||true / false|false|
|isActive|ノードがアクティブ（有効）かどうか。|bool||true / false|true|
|isStatic|ノードがスタティック（静的）かどうか。|bool||true / false|false|
|tag|ノードに付与されたタグ。|string|||Untagged|
|layer|ノードが位置するレイヤー。|int||[0, 31]|0|
|animator|アニメーター。|node.animator||||
|rigidbody|剛体。|node.rigidbody||||
|colliders|コライダーの一覧。|node.collider[]||||
|skybox|スカイボックス。|vgo.skybox||||
|light|光源。|vgo.light||||
|right|このノードのコピーライト。|vgo.right||||
|particle|パーティクルのインデックス。|int||||
|mesh|メッシュのインデックス。|int||||
|skin|スキンのインデックス。|int||||
|children|このノードの子ノードの一覧。|int[]||||


### アニメーター (node.animator)

|定義名|説明|データ タイプ|必須|設定値|既定値|
|:---|:---|:---|:---:|:---|:---:|
|name|オブジェクトの名前です。|string||||
|enabled|アニメーターが有効かどうか。|bool||true / false|true|
|humanAvatar|ヒューマン アバター。|vgo.humanAvatar||||
|applyRootMotion|ルートモーションを適用するべきかどうか。|bool||true / false|false|
|updateMode|アニメーターのアップデート モード。|enum||0: Normal<br>1: AnimatePhysics<br>2: UnscaledTime|0|
|cullingMode|アニメーターのカリング モード|enum||0: AlwaysAnimate<br>1: CullUpdateTransforms<br>2: CullCompletely|0|


#### ヒューマン アバター (vgo.humanAvatar)

人型アバターを使用する場合に設定します。

|定義名|説明|データ タイプ|必須|設定値|既定値|
|:---|:---|:---|:---:|:---|:---:|
|name|このヒューマン アバターの名前。|string||||
|humanBones|ヒューマンボーンの一覧。|vgo.HumanBone[]|true|||


#### ヒューマン ボーン (vgo.humanBone)

|定義名|説明|データ タイプ|必須|設定値|既定値|
|:---|:---|:---|:---:|:---|:---:|
|humanBodyBone|ヒューマン ボディ ボーン|enum|true|[0, 55]||
|nodeIndex|ノードのインデックス。|int|true|||


### 剛体 (node.rigidbody)

ノードを物理特性によって制御する場合に設定します。

|定義名|説明|データ タイプ|必須|設定値|既定値|
|:---|:---|:---:|:---:|:---|:---:|
|mass|物体の質量。(kg単位)|float||[0.0000001, 1000000000]||
|drag|力によって動く際に、オブジェクトに影響する空気抵抗の大きさ。|float||[0.0, infinity]||
|angularDrag|トルクによって回転する際に、オブジェクトに影響する空気抵抗の大きさ。|float||[0.0, infinity]||
|useGravity|オブジェクトが重力の影響を受けるかどうか。|bool||true / false|true|
|isKinematic|物理エンジンでなくTransformによって操作するかどうか。|bool||true / false|false|
|interpolation|補完タイプ。|enum||0: None<br>1: Interpolate<br>2: Extrapolate|0|
|collisionDetectionMode|衝突検知モード。|enum||0: Discrete<br>1: Continuous<br>2: ContinuousDynamic<br>3: ContinuousSpeculative|0|
|constraints|剛体の動きに関する制限。|int||FreesePositionX(2) \|<br>FreesePositionY(4) \|<br>FreesePositionZ(8) \|<br>FreeseRotationX(16) \|<br>FreeseRotationY(32) \|<br>FreeseRotationZ(64)|0|


### コライダー (node.collider)

オブジェクトが衝突判定を必要とする場合に設定します。

|定義名|説明|データ タイプ|必須|設定値|既定値|Box|Capsule|Sphere|
|:---|:---|:---:|:---|:---:|:---:|:---:|:---:|:---:|
|enabled|コライダーが有効かどうか。|bool||true / false|true|*|*|*|
|type|コライダーのタイプ。|enum||0: Box<br>1: Capsule<br>2: Sphere|0|*|*|*|
|isTrigger|コライダーがトリガーかどうか。|bool||true / false|false|*|*|*|
|center|オブジェクトのローカル空間でのコライダーの位置。(m単位)|float[3]||x, y, z|0.0, 0.0, 0.0|*|*|*|
|size|コライダーの大きさ。(m単位)|float[3]||x, y, z|1.0, 1.0, 1.0|*|-|-|
|radius|コライダーのローカル座標系における半径。(m単位)|float||[0, infinity]||-|*|*|
|height|コライダーの高さ。|float||[0, infinity]||-|*|-|
|direction|オブジェクトのローカル座標系における長辺方向の軸の向き。|int||0: X<br>1: Y<br>2: Z||-|*|-|
|physicMaterial|使用する物理特性マテリアル。|vgo.PhysicMaterial||||*|*|*|


### 物理特性マテリアル (vgo.physicMaterial)

衝突するオブジェクトの摩擦や跳ね返り効果を調整する場合に設定します。

|定義名|説明|データ タイプ|必須|設定値|既定値|
|:---|:---|:---:|:---:|:---|:---:|
|dynamicFriction|移動している物体に対する摩擦。|float||[0.0, 1.0]||
|staticFriction|面上で静止しているオブジェクトに使用される摩擦。|float||[0.0, 1.0]||
|bounciness|表面にどれだけ弾性があるか。|float||[0.0, 1.0]||
|frictionCombine|衝突するオブジェクト間の摩擦タイプ。|enum||0: Average<br>1: Multiply<br>2: Minimum<br>3: Maximum|0|
|bounceCombine|衝突するオブジェクト間の跳ね返しタイプ。|enum||0: Average<br>1: Multiply<br>2: Minimum<br>3: Maximum|0|


### スカイボックス (vgo.skybox)

スカイボックスを使用したい場合に設定します。

|定義名|説明|データ タイプ|必須|設定値|既定値|
|:---|:---|:---:|:---:|:---:|:---:|
|materialIndex|マテリアルのインデックス。|int||||

スカイボックスは通常は最大で1個まで設定できます。


### 光源 (vgo.light)

|definition name|description|type|required|setting value|default value|Spot|Directional|Point|Rectangle|Disc|
|:---|:---|:---:|:---:|:---|:---:|:---:|:---:|:---:|:---:|:---:|
|enabled|ライトが有効かどうか。|bool||true / false|true|*|*|*|*|*|
|type|ライトのタイプ。|enum||0: Spot<br>1: Directional<br>2: Point<br>3: Rectangle<br>4: Disc|0|*|*|*|*|*|
|shape|ライトの形状。|enum||0: Cone<br>1: Pyramid<br>2: Box|0|*|-|-|-|-|
|range|ライトの到達距離。|float||[0, infinity]||*|-|*|*|*|
|spotAngle|スポットライトの円錐形の底面の角度。（度単位）|float||[0, infinity]||*|-|-|-|-|
|areaSize|エリアライトのサイズ。|float[2]||x, y||-|-|-|*|-|
|areaRadius|エリアライトの半径。|float||[0, infinity]||-|-|-|-|*|
|color|光の色。|float[4]||r, g, b, a||*|*|*|*|*|
|lightmapBakeType|ライトのベイク タイプ。|enum||1: Mixed<br>2: Baked<br>4: Realtime||*|*|*|*|*|
|intensity|ライトの輝度。|float||[0, infinity]||*|*|*|*|*|
|bounceIntensity|バウンス照明の強度を定義する乗数。|float||[0, infinity]||*|*|*|*|*|
|shadows|この光がどのように影を落とすか。|enum||0: None<br>1: Hard<br>2: Soft|0|*|*|*|*|*|
|shadowRadius|影の範囲。|float||[0, infinity]||*|-|*|-|-|
|shadowAngle|影の角度。|float||[0, infinity]||-|*|-|-|-|
|shadowStrength|影の強度。|float||[0, infinity]||-|*|*|-|-|
|shadowResolution|シャドウマップの解像度。|enum||-1: FromQualitySettings<br>0: Low<br>1: Medium<br>2: High<br>3: VeryHigh|-1|-|*|*|-|-|
|shadowBias|影が現れなくなるライトからの距離。|float||[0, infinity]||-|*|*|-|-|
|shadowNormalBias|影を落す面が、面の法線に沿って縮小されるようになる距離。|float||[0, infinity]||-|*|*|-|-|
|shadowNearPlane|シャドウ錐台に使用する平面に近い値。|float||[0, infinity]||-|*|*|-|-|
|renderMode|ライトのレンダリング方法。|enum||0: Auto<br>1: ForcePixel<br>2: ForceVertex|0|*|*|*|*|*|
|cullingMask|カリング マスク。|int||[-1, infinity]|-1 (Everything)|*|*|*|*|*|

Cookie、Flare、Halo はサポートされていません。


### JSON example (layout.nodes)

```json:layout.json(nodes)
{
    "nodes": [
        {
            "name": "Node1",
            "isRoot": true,
            "tag": "Player",
            "animator": {
                "humanAvatar": {
                    "name": "",
                    "humanBones": []
                }
            },
            "children": [
                1,
                2,
                3,
                4,
                5
            ]
        },
        {
            "name": "Node2",
            "layer": 1,
            "rigidbody": {
                "mass": 1,
                "drag": 0,
                "angularDrag": 0.05,
                "useGravity": true,
                "isKinematic": false,
                "interpolation": 0,
                "collisionDetectionMode": 0,
                "constraints": 0
            },
            "colliders": [
                {
                    "type": 0,
                    "center": [ 0, 0, 0 ],
                    "size": [ 1, 1, 1 ]
                },
                {
                    "enabled": false,
                    "type": 1,
                    "radius": 0.49999997,
                    "height": 1,
                    "direction": 1,
                    "physicMaterial": {
                        "dynamicFriction": 0.6,
                        "staticFriction": 0.6,
                        "bounciness": 0,
                        "frictionCombine": 0,
                        "bounceCombine": 0
                    }
                }
            ],
            "mesh": 0
        }
    ]
}
```

### スキン (layout.skin)

スキンを定義するジョイントとマトリックス。

|定義名|説明|データ タイプ|必須|設定値|既定値|
|:---|:---|:---:|:---:|:---:|:---:|
|inverseBindMatrices|浮動小数点の4x4逆バインド行列を含むアクセサーのインデックス。|int||||
|skeleton|スケルトン ルートとして使用されるノードのインデックス。|int||||
|joints|このスキンのジョイントとして使用されるスケルトン ノードのインデックス。|int[]|true|||

### メッシュ (layout.mesh)

レンダリングされるプリミティブのセット。

|定義名|説明|データ タイプ|必須|設定値|既定値|
|:---|:---|:---:|:---:|:---|:---:|
|name|このメッシュの名前。|string|true|||
|attributes|辞書マッピング属性。|mesh.primitive.attributes|true|||
|subMeshes|サブメッシュ インデックスを含むアクセサーのインデックス。|int[]||||
|materials|レンダリング時にこのプリミティブに適用するマテリアルのインデックスリスト。|int[]||||
|blendShapeKind|ブレンドシェイプの種類。|enum||0: None<br>1: Face<br>2: Face_2<br>3: Kind_3<br>4: Kind_4<br>5: Kind_5|0|
|blendShapes|ブレンドシェイプのリスト。|mesh.blendshape[]||||
|blendShapePesets|ブレンドシェイプ プリセットのリスト。|mesh.blendshape.preset[]||||

### メッシュ プリミティブ属性 (mesh.primitive.attributes)

辞書オブジェクト。

|データ タイプ|キー|値|
|:---:|:---|:---:|
|Dictionary<string, int>|POSITION<br>NORMAL<br>TANGENT<br>COLOR_0<br>TEXCOORD_0<br>JOINTS_0<br>WEIGHTS_0|アクセサー インデックス|

|キー|アクセサー データ タイプ|
|:---|:---|
|POSITION|Vector3 (float)|
|NORMAL|Vector3 (float)|
|TANGENT|Vector4 (float)|
|COLOR_0|Color4 (ubyte)<br>Color4 (float)|
|TEXCOORD_0|Vector2 (float)|
|JOINTS_0|Vector4 (ubyte)<br>Vector4 (ushort)|
|WEIGHTS_0|Vector4 (float)|

### ブレンドシェイプ (mesh.blendshape)

メッシュ ブレンドシェイプ。

|定義名|説明|データ タイプ|必須|設定値|既定値|
|:---|:---|:---:|:---:|:---|:---:|
|name|ブレンドシェイプの名前。|string|true|||
|attributes|辞書マッピング属性。<br>`POSITION`,`NORMAL`,`TANGENT`のみ含めることができます。|mesh.primitive.attributes|true|||
|facePartsType|顔パーツのタイプ。|enum||0: None<br>10: Forehead<br>11: Eyebrow<br>12: Eyelashes<br>13: Eyelid<br>14: Pupil<br>20: Ear<br>30: Nose<br>40: Cheek<br>50: Mouth<br>51: Teeth<br>52: Tongue<br>60: Hair<br>61: BackHair<br>62: SideHair<br>63: Frizz<br>64: EarHair<br>65: NoseHair<br>66: Mustache<br>67: Beard<br>70: Mole|0|
|blinkType|まばたきのタイプ。|enum||0: None<br>1: Left<br>2: Right<br>3: Both|0|
|visemeType|口形素のタイプ。|enum||-1: None<br>0: Silence<br>1: PP<br>2: FF<br>3: TH<br>4: DD<br>5: kk<br>6: CH<br>7: SS<br>8: nn<br>9: RR<br>10: A<br>11: E<br>12: I<br>13: O<br>14: U|-1|

### ブレンドシェイプ プリセット (mesh.blendshape.preset)

ブレンドシェイプのプリセット。

|定義名|説明|データ タイプ|必須|設定値|既定値|
|:---|:---|:---:|:---:|:---|:---:|
|name|プリセットの名前。|string||||
|type|プリセットのタイプ。|enum|true|0: Custom<br>1: Neutral<br>2: Joy<br>3: Angry<br>4: Sorrow<br>5: Fun<br>6: Confuse<br>7: Nervous<br>8: Sleepy<br>9: Surprise<br>10: WinkL<br>11: WinkR<br>12: Preset_12<br>13: Preset_13<br>14: Preset_14<br>15: Preset_15||
|bindings|バインディングのリスト。|mesh.blendshape.binding[]|true|||

### ブレンドシェイプ バインディング (mesh.blendshape.binding)

プリセットのブレンドシェイプ バインディング。

|定義名|説明|データ タイプ|必須|設定値|既定値|
|:---|:---|:---:|:---:|:---|:---:|
|index|ブレンドシェイプのインデックス。|int|true|||
|weight|このブレンドシェイプのウェイト。|float||[0.0, 100.0]|0|


### JSON example (layout.meshes)

```json:layout.json(meshes)
{
    "meshes": [
        {
            "name": "face",
            "attributes": {
                "POSITION": 59,
                "NORMAL": 60,
                "TEXCOORD_0": 61,
                "JOINTS_0": 62,
                "WEIGHTS_0": 63
            },
            "subMeshes": [
                64,
                65,
                66
            ],
            "materials": [
                4,
                5,
                6
            ],
            "blendShapeKind": 1,
            "blendShapes": [
                {
                    "name": "face.mouth_a",
                    "attributes": {
                        "POSITION": 67,
                        "NORMAL": 68,
                        "TANGENT": -1
                    },
                    "facePartsType": 50,
                    "blinkType": 0,
                    "visemeType": 10
                }
            ],
            "blendShapePesets": [
                {
                    "name": "Joy",
                    "type": 2,
                    "bindings": [
                        {
                            "index": 24,
                            "weight": 100.0
                        },
                        {
                            "index": 36,
                            "weight": 100.0
                        },
                        {
                            "index": 44,
                            "weight": 100.0
                        }
                    ]
                }
            ]
        }
    ]
}
```

### マテリアル (layout.material)

プリミティブのマテリアルの外観。

|定義名|説明|データ タイプ|必須|設定値|既定値|
|:---|:---|:---|:---:|:---:|:---:|
|name|マテリアルの名前。|string|true|||
|shaderName|シェーダー名。|string|true|||
|renderQueue|レンダー キュー。|int||||
|isUnlit|マテリアルがライトの影響を受けないかどうか。|bool||true / false|false|
|intProperties|キーはプロパティ名です。|Dictionary<string, int>||||
|floatProperties|キーはプロパティ名です。|Dictionary<string, float>||||
|colorProperties|キーはプロパティ名です。<br>値は color[3] または color[4] です。|Dictionary<string, float[]>||||
|vectorProperties|キーはプロパティ名です。<br>値は vector です。|Dictionary<string, float[]>||||
|matrixProperties|キーはプロパティ名です。<br>値は matrix です。|Dictionary<string, float[]>||||
|textureOffsetProperties|キーはプロパティ名です。<br>値は vector2 です。|Dictionary<string, float[]>||||
|textureScaleProperties|キーはプロパティ名です。<br>値は vector2 です。|Dictionary<string, float[]>||||
|textureIndexProperties|キーはプロパティ名です。|Dictionary<string, int>||||
|keywordMap|キーはキーワードです。|Dictionary<string, bool>||||
|tagMap|キーはタグ名です。|Dictionary<string, string>||||
|extensions|拡張定義。|object|||

### JSON example (layout.materials)

```json:layout.json(materials)
{
    "materials": [
        {
            "name": "StandardMaterial",
            "shaderName": "Standard",
            "renderQueue": 2000,
            "intProperties": {
                "_Mode": 0,
                "_SmoothnessTextureChannel": 0,
                "_SpecularHighlights": 1,
                "_GlossyReflections": 1,
                "_UVSec": 0
            },
            "floatProperties": {
                "_Cutoff": 0.5,
                "_Metallic": 0,
                "_Glossiness": 0.5,
                "_GlossMapScale": 1,
                "_BumpScale": 1,
                "_Parallax": 0.02,
                "_OcclusionStrength": 1,
                "_DetailNormalMapScale": 1
            },
            "colorProperties": {
                "_Color": [
                    0.743349731,
                    0.4882486,
                    0.181164235,
                    1
                ],
                "_EmissionColor": [
                    0,
                    0,
                    0
                ]
            },
            "textureScaleProperties": {
                "_MainTex": [
                    5,
                    5
                ]
            },
            "textureIndexProperties": {
                "_MainTex": 1
            },
            "keywordMap": {
                "_NORMALMAP": false,
                "_PARALLAXMAP": false,
                "_EMISSION": false,
                "_DETAIL_MULX2": false,
                "_METALLICGLOSSMAP": false
            }
        }
    ]
}
```

### テクスチャー (layout.texture)

テクスチャー。

|定義名|説明|データ タイプ|必須|設定値|既定値|
|:---|:---|:---|:---:|:---|:---:|
|name|テクスチャーの名前。|string|true|||
|source|イメージを格納したアクセサーのインデックス。|int||||
|dimensionType|テクスチャーの次元タイプ。|enum||-1: Unknown<br>0: None<br>1: Any<br>2: Tex2D<br>3: Tex3D<br>4: Cube<br>5: Tex2DArray<br>6: CubeArray|0|
|mapType|テクスチャー マップのタイプ。|enum||-1: Unknown<br>0: Default<br>1: NormalMap<br>2: HeightMap<br>3: OcclusionMap<br>4: EmissionMap<br>5: MetallicRoughnessMap<br>6: SpecularGlossinessMap<br>7: CubeMap|0|
|colorSpace|イメージ カラー スペース。|enum||0: sRGB<br>1: Linear|0|
|mimeType|画像のMIMEタイプ。|string||image/jpeg<br>image/png||
|filterMode|テクスチャーのフィルタリング モード。|enum||0: Point<br>1: Bilinear<br>2: Trilinear|0|
|wrapMode|テクスチャー座標ラッピング モード。|enum||0: Repeat<br>1: Clamp<br>2: Mirror<br>3: MirrorOnce|0|
|wrapModeU|テクスチャーU座標ラッピング モード。|enum||0: Repeat<br>1: Clamp<br>2: Mirror<br>3: MirrorOnce|0|
|wrapModeV|テクスチャーV座標ラッピング モード。|enum||0: Repeat<br>1: Clamp<br>2: Mirror<br>3: MirrorOnce|0|
|metallicRoughness|マテリアルの金属の粗さ。|float||[0.0, 1.0]||
|extensions|拡張定義。|object|||

### JSON example (layout.textures)

```json:layout.json(textures)
{
    "textures": [
        {
            "name": "MetallicTexture",
            "source": 1,
            "dimensionType": 2,
            "mapType": 5,
            "colorSpace": 1,
            "mimeType": "image/png",
            "filterMode": 1,
            "wrapMode": 0,
            "wrapModeU": 0,
            "wrapModeV": 0,
            "metallicRoughness": 0.5
        }
    ]
}
```

## 目次

- [全体目次] (https://qiita.com/izayoijiichan/items/5c7004cd87fe31a08414)
  - [1. ファイル仕様] (https://qiita.com/izayoijiichan/items/f25acc93cf3a7c46c4bb)
  - 2. データ スキーマ（現在位置）