第2部 自作ライブラリ紹介

23
1 2: 自作ライブラリ 紹介 らりお

Upload: larry

Post on 08-Jan-2017

26 views

Category:

Engineering


3 download

TRANSCRIPT

1

第2部: 自作ライブラリ紹介

らりお

2

第2部: らりおの以上な執着または私は如何にしてFBX SDKを止めてライブラリを書

くようになったか

プロプライエタリ仕様が公開されていない

「使いたいならFBX SDKとかを使ってね」

何が問題か:

仕様変更があったとき把握が大変

完全に把握することは実質不可能)

そもそも仕様の把握が困難

SDKを使うことを強いられる

3

SDKの何が問題なのか [1]ライセンス読みたくない(読めない)

ワタシエイゴワカリマセーン

再配布可能なのか、商用利用可能なのか、ライセンスの継承は必要なのか、FBX SDKに関する許諾表示は必要か、etc.

によると、再配布不可、許諾表示必要、利用ソフトのライセンス制限あり、ということらしいが…

→無償/有償配布するゲームに使いたくない

CG系ライブラリ特集 - uimac実装メモ

4 . 1

SDKの何が問題なのか [2]コンパイラのバージョンを制限される

gcc-4でビルドしなければいけない

つまりC++14が使えない (C++14準拠はgcc-5から)

そもそもclangも使えない

(html)が滅茶苦茶重い

JSフル活用?

ドキュメント

4 . 2

SDKの何が問題なのか [3]仕様の把握が面倒

ライブラリがデカい

しかもC++らしくないコードが多いので、すんなり頭に入ってこない

仕様変更への追従が面倒

クラス名が変わったりとか、いろいろ

一応 は存在するが、それはあって当然

ChangeLogっぽいドキュメント

4 . 3

欲しいのは仕様の把握が楽

ある程度シンプル(あるいは素直)であること

互換性が崩れづらい、または仕様変更への追従が楽

設計がシンプルなら自動的にこの条件は満たされる

オープンソースである

ソースを公開したいし、CDにバイナリを入れて有償で頒布したりもできるのが望ましい

Rustで使える

5 . 1

RUST #とは近代・現代のあらゆるプログラミング言語の知見を詰め込んだ、超現代的でハイパフォーマンスな言語

(個人の感想です)

俗に言う「ポストC++」のひとつ

良いところの例:

ポインタの有効性がコンパイル時にチェックされる

単なるreturnと同等のコストで、例外のようなエラー処理が可能

仮想関数(相当)の呼び出しコストが基本的に低い

5 . 25 . 3

なぜRUST?C++やコンパイラの闇、ライブラリ(もしくはドライバ?)のバグに遭遇しまくって疲れたので、C++使いたくなかった

並列計算とかが始めから想定されていたので、ゲームで使うマルチスレッドでも安心できそう

6 . 1

作る無かったのでライブラリ作った。

ゲーム作りたかったのにライブラリが出来た。

自分で作ったので、

仕様の把握は完璧

仕様変更も自分の使いやすいように可能

オープンソースにしたのでライセンスも問題なし

l1048576/fbx_direct: low-level fbx reader/writer libraryfor Rust programming language

6 . 2

FBX_DIRECT #とはFBX reader/writerの低レベルライブラリ

JavaのXMLライブラリであるStAX (Streaming API forXML)ライクなAPIを提供

Rust上でのインターフェースは既存のXMLパーサ( )を パクった 参考にしたnetvl/xml-rs: An XML library in Rust

7 . 1

FBX_DIRECT #とは木構造を取り出すためのものであって、中身の意味には一切関知しない

つまり、XMLに出すはずのイベントを変換して垂れ流せば、FBX形式で任意のデータを保管することも可能

FBXの文法が、本質的にはXMLとかjsonとかのように、任意の木構造を保持できることを思い出してください

(しかもFBX binaryは型が厳密)

7 . 2

XMLライブラリと比較してみるイベントの種類に着目する。

イベントの種類ドキュメント開始・終了イベント: 両方にある

ノード開始イベント: 両方にある

名前: 両方にある

属性・プロパティ: それぞれにある (※)

名前空間: XMLにだけある

ノード終了イベント: 両方にある

コメント: 両方にある

8 . 18 . 2

XMLにしかないイベント・情報Processing Instruction

XMLプロセッサに、処理系依存の情報を伝えるもの

C言語でいう #pragma みたいなもの

CData, Characters (いわゆるテキストノード)

XMLでは、テキスト情報だけを持つノードを、タグ無しで記述できる

XMLの属性はmap(辞書)であり、FBXのプロパティ(配列)より柔軟

8 . 3

FBXだけの特徴型が(ある程度)明確

XMLでは、属性・テキストノード・要素名・名前空間など、すべては本質的にテキスト

数値なのか、フォーマットされているのかはスキーマを見るまで不明

バイナリとテキストを選択できる

8 . 4

実装状況FBX binary reader/writer: ともに7.4/7.5対応

FBX ascii writer: 7.4/7.5対応

FBX ascii reader: 未実装

需要ないと思うし、優先度極めて低し

pegとか興味あるので、よほど余裕があれば実装するかも

誰か書いてくれたりしないかな(オープンソースだし)

9 . 1

できること、できそうなこと変換

FBX binary 7.4と7.5の相互変換

FBX binary 7.4と7.5からFBX ascii 7.4/7.5への変換

XMLやjsonでのオブジェクトのシリアライザのAPIに対応すれば、「任意のオブジェクトをFBXに保存/読み込み」が実装できるはず

やりません(今は)

だれか ライブラリについて詳しく教えてくれたら考えます

serde

9 . 2

これからやることとか上のレイヤーのローダ書きます

今回作ったのは、低級API

ゲームに必要なのは、「○○という名前のメッシュの法線を取得する」のような高級API

それができたら、ゲーム作ります

その前に人体の生成・調整みたいなのやりたいかも

というOSSはあるのだが、リアルすぎ

CM3D2欲しいけど高いので、可能なら自分で作ってみたいよね (諦めたら買います)

MakeHuman

9 . 3

で?FBXは3Dコンテンツ以外の様々な情報も表現できる

だからといって、あらゆるセーブデータをFBXで保存しようとするのは止めましょう

今回私の書いた fbx_direct ライブラリは低レイヤーであり、直接ゲームに使うようなものではない

でも出力も書いたので、将来的にゲーム中で作ったアニメーションやモデルの出力に使えるはず

これから上の方(スキーマ)のライブラリを書きます

おしまい。

10

参考 (1)画像:

リポジトリ:

ドキュメント:

:

マリー・アントワネット - Wikipedia

l1048576/fbx_direct: low-level fbxreader/writer library for Rust programming language

fbx_direct - Rust

crates.io fbx_direct - Cargo

11 . 1

参考 (2)xml-rs:

StAX:

MakeHuman:

serde:

netvl/xml-rs: An XML library in Rust

StAX - Wikipedia, the free encyclopedia

MakeHuman | Open source tool for making3d characters

serde-rs/serde: Rust serialization