SlideShare a Scribd company logo
1 of 23
Download to read offline
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++使いた
くなかった
並列計算とかが始めから想定されていたので、ゲーム
で使うマルチスレッドでも安心できそう
無ければ…
マリー・アントワネット(1755-1793)
6 . 1
作る
無かったのでライブラリ作った。
ゲーム作りたかったのにライブラリが出来た。
自分で作ったので、
仕様の把握は完璧
仕様変更も自分の使いやすいように可能
オープンソースにしたのでライセンスも問題なし
l1048576/fbx_direct: low-level fbx reader/writer library
for Rust programming language
6 . 2
FBX_DIRECT #とは
FBX reader/writerの低レベルライブラリ
JavaのXMLライブラリであるStAX (Streaming API for
XML)ライクな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 fbx
reader/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 making
3d characters
serde-rs/serde: Rust serialization

More Related Content

What's hot

プログラマが欲しい仕様書とは
プログラマが欲しい仕様書とはプログラマが欲しい仕様書とは
プログラマが欲しい仕様書とは
Katsutoshi Makino
 
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてカスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
 
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
DADA246
 

What's hot (20)

Unityで始めるバージョン管理 Git LFS 入門編
Unityで始めるバージョン管理 Git LFS 入門編Unityで始めるバージョン管理 Git LFS 入門編
Unityで始めるバージョン管理 Git LFS 入門編
 
UE4のスレッドの流れと Input Latency改善の仕組み
UE4のスレッドの流れとInput Latency改善の仕組みUE4のスレッドの流れとInput Latency改善の仕組み
UE4のスレッドの流れと Input Latency改善の仕組み
 
UE4における大規模レベル実装ワークフローとブループリント活用事例
UE4における大規模レベル実装ワークフローとブループリント活用事例UE4における大規模レベル実装ワークフローとブループリント活用事例
UE4における大規模レベル実装ワークフローとブループリント活用事例
 
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
 
UE4 Volumetric Fogで 空間を演出する!
UE4 Volumetric Fogで 空間を演出する!UE4 Volumetric Fogで 空間を演出する!
UE4 Volumetric Fogで 空間を演出する!
 
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
 
Unicode文字列処理
Unicode文字列処理Unicode文字列処理
Unicode文字列処理
 
プログラマが欲しい仕様書とは
プログラマが欲しい仕様書とはプログラマが欲しい仕様書とは
プログラマが欲しい仕様書とは
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
SceneCapture2Dを使って壁の向こうを見る -気になるあの娘の部屋の壁-
SceneCapture2Dを使って壁の向こうを見る -気になるあの娘の部屋の壁-SceneCapture2Dを使って壁の向こうを見る -気になるあの娘の部屋の壁-
SceneCapture2Dを使って壁の向こうを見る -気になるあの娘の部屋の壁-
 
UE4のライティング解体新書~効果的なNPRのためにライティングの仕組みを理解しよう~
UE4のライティング解体新書~効果的なNPRのためにライティングの仕組みを理解しよう~UE4のライティング解体新書~効果的なNPRのためにライティングの仕組みを理解しよう~
UE4のライティング解体新書~効果的なNPRのためにライティングの仕組みを理解しよう~
 
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてカスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
 
UE4背景アーティスト勉強会(後編) 実演+解説
UE4背景アーティスト勉強会(後編) 実演+解説UE4背景アーティスト勉強会(後編) 実演+解説
UE4背景アーティスト勉強会(後編) 実演+解説
 
Halo2 におけるHFSM(階層型有限状態マシン) 【ビヘイビアツリー解説】
Halo2 におけるHFSM(階層型有限状態マシン)  【ビヘイビアツリー解説】Halo2 におけるHFSM(階層型有限状態マシン)  【ビヘイビアツリー解説】
Halo2 におけるHFSM(階層型有限状態マシン) 【ビヘイビアツリー解説】
 
[CEDEC2018] UE4アニメーションシステム総おさらい
[CEDEC2018] UE4アニメーションシステム総おさらい[CEDEC2018] UE4アニメーションシステム総おさらい
[CEDEC2018] UE4アニメーションシステム総おさらい
 
ゲームの仕様書を書こう4 仕様書作成で楽をするconfluenceの活用
ゲームの仕様書を書こう4 仕様書作成で楽をするconfluenceの活用ゲームの仕様書を書こう4 仕様書作成で楽をするconfluenceの活用
ゲームの仕様書を書こう4 仕様書作成で楽をするconfluenceの活用
 
UE4でマルチプレイヤーゲームを作ろう
UE4でマルチプレイヤーゲームを作ろうUE4でマルチプレイヤーゲームを作ろう
UE4でマルチプレイヤーゲームを作ろう
 
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
 

Viewers also liked

日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
kumake
 
プログラミング言語のマスコットとか紹介
プログラミング言語のマスコットとか紹介プログラミング言語のマスコットとか紹介
プログラミング言語のマスコットとか紹介
Takaaki Hirano
 
闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみた
Satoshi Sato
 

Viewers also liked (16)

日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
 
Rust 超入門
Rust 超入門Rust 超入門
Rust 超入門
 
C++の黒魔術
C++の黒魔術C++の黒魔術
C++の黒魔術
 
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
 
Rust言語
Rust言語Rust言語
Rust言語
 
パワポアート・オンライン
パワポアート・オンラインパワポアート・オンライン
パワポアート・オンライン
 
Rust言語紹介
Rust言語紹介Rust言語紹介
Rust言語紹介
 
プログラミング言語のマスコットとか紹介
プログラミング言語のマスコットとか紹介プログラミング言語のマスコットとか紹介
プログラミング言語のマスコットとか紹介
 
PHPのテスト名を日本語にした話
PHPのテスト名を日本語にした話PHPのテスト名を日本語にした話
PHPのテスト名を日本語にした話
 
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数
 
Skia & Freetype - Android 2D Graphics Essentials
Skia & Freetype - Android 2D Graphics EssentialsSkia & Freetype - Android 2D Graphics Essentials
Skia & Freetype - Android 2D Graphics Essentials
 
磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!
 
数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由
 
闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみた
 
ネイティブ開発アンチパターン
ネイティブ開発アンチパターンネイティブ開発アンチパターン
ネイティブ開発アンチパターン
 

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