GOM(Game Oriented Model Format)草案

GOMフォーマット仕様書

Game Oriented Model Format (.gom) Version 1.0 (Complete Specification)


1. 目的

GOMは、FBX等のDCCデータをゲーム実行向けに最適化し、 オフライン変換して保存するためのフォーマットである。

設計目標


2. 空間設計ポリシー(不変条件)

Invariant A: 頂点空間

禁止事項


3. 行列規約(最終固定)

GOM v1では以下を固定する。


4. ファイル形式

GOMはテキスト形式(GOMT0001)とバイナリ形式(GOMB0001)を持つ。

マジックナンバー(先頭8バイト)


5. テキスト形式(GOMT0001)

UTF-8(BOMなし)、構造リテラル形式。

5.1 Skeleton

Skeleton = {
  boneCount = <int>,
  bones = [
    {
      parent = <int>,
      name   = "<string>",
      path   = "<string>",
      bindLocal = [[...],[...],[...],[...]]
    }
  ]
}

5.2 MeshPart

Meshes = [
  {
    name = "<string>",
    meshBindGeoToModel = [[...],[...],[...],[...]],
    vertices = [ { p,n,t,uv,bi,bw } ],
    indices = [ ... ],
    submeshes = [ { materialIndex, indexStart, indexCount } ],
    inverseBind = [ [[...]] ]
  }
]

ウェイト規約(必須)

5.3 Animation

Animations = [
  {
    name = "<string>",
    duration = <float>,
    rootBoneIndex = <int>,
    flags = ["HasRootMotion"],
    tracks = [ { bone, keys[] } ]
  }
]

補間:T/S=linear、R=slerp


6. MeshPart規約

Rule M1

Rule M2

以下の場合はMeshPartを分割する:


7. バイナリ形式(GOMB0001)

7.1 固定ヘッダ(512 bytes)

Little Endian固定。

7.1.1 固定値

7.1.2 列挙値(enum)定義

本仕様の enum はすべて uint32 とする。 未知の enum 値を受け取った場合、読み込みはエラーとする(v1)。

endianness(将来用)

v1ではファイルはLittle Endian固定だが、将来拡張のためヘッダに enum を持つ。

coordinateSystem

matrixConvention

行列の「格納順+演算規約」を表す。

定義:

7.1.3 validationFlags(bitfield)

validationFlagsuint32

予約:bit3以降は将来用。v1では0。

7.1.4 ChunkTableの指定


char   magic[8]              // GOMB0001
uint32 headerSize            // 512
uint32 formatVersion         // 1
uint32 coordinateSystem      // enum
uint32 matrixConvention      // enum
uint8  sourceHash[32]        // SHA-256 raw
uint32 converterVersionStr   // STR0 index
uint32 validationFlags       // bitfield
uint32 chunkTableOffset
uint32 chunkTableCount
uint8  reserved[...]         // 0埋め

8. バイナリ全体の堅牢ルール(バイナリ専用)

8.1 Endianness

8.2 アライメント

8.3 チャンク基本構造

uint32 fourcc
uint32 size
uint32 version
uint32 flags
byte payload[size]
pad to 16

8.4 チャンクサイズ上限チェック(必須)

8.5 未知チャンク

8.6 ChunkTable(任意)

8.7 MSH0.flags(任意)


9. バイナリチャンク厳密レイアウト

STR0

uint32 stringCount
uint32 offsets[stringCount]
uint32 dataSize
uint8  data[dataSize]

SKEL

uint32 boneCount
int32 parent[boneCount]
uint32 nameId[boneCount]
uint32 pathId[boneCount]
float32 bindLocal[boneCount][16]

MSH0

uint32 meshNameId
uint32 vertexFormat
uint32 vertexCount
uint32 indexCount
uint32 boneCount
uint32 flags
uint32 reserved[2]

VB0

uint32 vertexCount
uint32 stride
uint32 vertexFormat
uint32 reserved
uint8  data[vertexCount*stride]

IB0

uint32 indexCount
uint32 indexSizeBytes
uint32 reserved[2]
uint8 data[indexCount*indexSizeBytes]

SUB0

uint32 submeshCount
struct { int32 materialIndex; uint32 indexStart; uint32 indexCount; }

IBND

uint32 boneCount
float32 inverseBind[boneCount][16]

BND0

float32 aabbMin[3]
float32 aabbMax[3]
float32 sphereCenter[3]
float32 sphereRadius

GBTM(任意)

float32 meshBindGeoToModel[16]

ANIM

uint32 clipCount

CLP0

uint32 clipNameId
float32 duration
float32 sampleRate
int32 rootBoneIndex
uint32 flags
uint32 trackCount

Track構造:

int32 boneIndex
uint32 keyCount
for each key:
  float32 time
  float32 tr[3]
  float32 rot[4]
  float32 sc[3]

10. 変換ツール検証(必須)



11. 実装安全規約(v1推奨)

11.1 読み込み上限値(推奨)

実装は以下の上限を持つことを推奨する(超過時はエラー)。

※ 実装側で変更可能だが、無制限読み込みは禁止。


11.2 必須チャンク条件(バイナリ)

各 MSH0 は以下の子チャンクを必須とする:

GBTM は任意。

IB0.indexSizeBytes は 2 または 4 のみ許可。 それ以外は読み込みエラー。


11.3 アニメキー時刻規約


11.4 inverseBind の定義

inverseBind[i] は、bind姿勢における boneWorld[i] の逆行列に相当する。

スキニングパレットは以下で構成される:

palette[i] = boneWorld_current[i] * inverseBind[i]

これにより、geometry 空間内でスキニングが完結する。


End of GOM Specification v1.0


Revision #1
Created 2 March 2026 23:42:41 by youe2
Updated 2 June 2026 20:53:01 by youe2