Investigation on next-gen scene file format.

by syoyo

新しいことをやるなら、せっかくなのでいろいろ提案したい.
そこで、次世代のシーンファイルフォーマット(主にレンダラ向け)はなにがいいか、
最近いろいろ考えています.

要求としては、

– シンプルかつ拡張性がある
– 人間が読めるものである(XML は論外)
– なるべく既存のものと互換性がある
– 大規模データ、また DelayedReadArchive, Procedural のようなものが扱える

になるでしょうか.

今の所のところの候補は 2 つ. Python と JSON(JavaScript) です.

Python as a scene file format

Python は Gelato でシーンフォーマットとして採用されていましたね.
Python プログラムそのままをシーンデータとして扱うことができます.

利点としては、

– 既存の 3D アプリが Python 対応のものが多いので、ユーザの認知度が高く、知識の流用ができる.
– Python スクリプトなので、動的ジオメトリ生成(procedural)などが容易に書ける.

欠点としては、

– Python インタプリタを含める必要がある(自前で Python コンパイラを作らない場合).
– 特に既存 Python インタプリタを使う場合、大規模データを食わせたときのパースの時間が気になる.
– ちょっと記述の自由度が高く、フリーダムすぎるかな. 何かしら制約は付けたいところ.

が挙げられます.

JSON(JavaScript) as a scene file format

Web の世界では JSON という XML, YAML のような簡単なルールで定義されたデータフォーマットがあります.
これの良い所は、eval() すれば簡単に JavaScript に取り込めることができます(つまりパーサいらず).

シーンファイルとして解釈するばあい、
オブジェクトインスタンス(リファレンス)や、procedural で実行するコードフラグメントも JSON ファイル内に含めることができます.
(リファレンスはリンク文字列で表現できる)

利点としては、

– 記述ルールが決まっているので、自前で高速パーサを書くことも可能. よって大規模データでも対応しやすい.
– 同じく記述ルールが決まっているので、バリデータを書きやすい.
– JavaScript 以外の言語にもパーサが広く移植されている.

欠点としては、

– ベクトル型とか記述できない(基本は文字列、数値、配列だけ)ので、ちょっと書き方が冗長になる(手で書く場合).
- アイテムの区切りにカンマを忘れずに書かなければならない

でしょうか.
JSON は、試しに V8 で動く例を作ってみました(read() を使っているので V8 の shell 上でしか動きません).


// A sample for next-gen scene file format
{
    "name": "myscene.json",

    "camera":
    {
        "eye": [0, 0, 0],
        "target": [0, 0, -1],
        "up": [0, 1, 0]
    },

    "world":
    {
        "polygon1":
        {
            "positions": [1, 1, 0, 1, -1, 0, -1, -1, 0, -1, 1, 0]
        }
    }
}

これを読んで解釈する JavaScript はこんな感じ.


// main.js
var scene = JSON.parse(read("scene.json"))
print("camera.eye = " + scene.camera.eye);
print("camera.target = " + scene.camera.target);
print("camera.up = " + scene.camera.up);
print("triangle.v[0].x = " + scene.world.polygon1.positions[0])

$ shell main.js
camera.eye = 0,0,0
camera.target = 0,0,-1
camera.up = 0,1,0
triangle.v[0].x = 1

どうでしょう? 以外と JSON よさげではないでしょうか.

Advertisements