第2部 自作ライブラリ紹介
TRANSCRIPT
プロプライエタリ仕様が公開されていない
「使いたいなら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++使いたくなかった
並列計算とかが始めから想定されていたので、ゲームで使うマルチスレッドでも安心できそう
無ければ…
マリー・アントワネット(1755-1793)
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は型が厳密)
イベントの種類ドキュメント開始・終了イベント: 両方にある
ノード開始イベント: 両方にある
名前: 両方にある
属性・プロパティ: それぞれにある (※)
名前空間: 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