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

なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングなぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングSatoshi Kodaira
 
GLSLtech2018 レイマーチングで半歩差のつく小技集
GLSLtech2018 レイマーチングで半歩差のつく小技集GLSLtech2018 レイマーチングで半歩差のつく小技集
GLSLtech2018 レイマーチングで半歩差のつく小技集Kei Mesuda
 
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~UnityTechnologiesJapan002
 
中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~ProjectAsura
 
OpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみたOpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみたTakahiro Miyaura
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計Yoshinori Matsunobu
 
【Unite 2018 Tokyo】Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~
【Unite 2018 Tokyo】Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~【Unite 2018 Tokyo】Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~
【Unite 2018 Tokyo】Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~UnityTechnologiesJapan002
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫Yuta Imai
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編infinite_loop
 
レイトレ空間構造入門
レイトレ空間構造入門レイトレ空間構造入門
レイトレ空間構造入門Toru Matsuoka
 
基礎線形代数講座
基礎線形代数講座基礎線形代数講座
基礎線形代数講座SEGADevTech
 
CEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライド
CEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライドCEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライド
CEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライドToshiyasu Miyabe
 
わからないまま使っている?UE4 の AI の基本的なこと
わからないまま使っている?UE4 の AI の基本的なことわからないまま使っている?UE4 の AI の基本的なこと
わからないまま使っている?UE4 の AI の基本的なことrarihoma
 

What's hot (20)

なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングなぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリング
 
UE4ディープラーニングってやつでなんとかして!環境構築編(Python3+TensorFlow)
UE4ディープラーニングってやつでなんとかして!環境構築編(Python3+TensorFlow) UE4ディープラーニングってやつでなんとかして!環境構築編(Python3+TensorFlow)
UE4ディープラーニングってやつでなんとかして!環境構築編(Python3+TensorFlow)
 
GLSLtech2018 レイマーチングで半歩差のつく小技集
GLSLtech2018 レイマーチングで半歩差のつく小技集GLSLtech2018 レイマーチングで半歩差のつく小技集
GLSLtech2018 レイマーチングで半歩差のつく小技集
 
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
 
GPU最適化入門
GPU最適化入門GPU最適化入門
GPU最適化入門
 
中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~
 
OpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみたOpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみた
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
【Unite 2018 Tokyo】Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~
【Unite 2018 Tokyo】Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~【Unite 2018 Tokyo】Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~
【Unite 2018 Tokyo】Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
 
レイトレ空間構造入門
レイトレ空間構造入門レイトレ空間構造入門
レイトレ空間構造入門
 
基礎線形代数講座
基礎線形代数講座基礎線形代数講座
基礎線形代数講座
 
CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらいCEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
 
CEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライド
CEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライドCEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライド
CEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライド
 
UE4とUnrealC++について
UE4とUnrealC++についてUE4とUnrealC++について
UE4とUnrealC++について
 
わからないまま使っている?UE4 の AI の基本的なこと
わからないまま使っている?UE4 の AI の基本的なことわからないまま使っている?UE4 の AI の基本的なこと
わからないまま使っている?UE4 の AI の基本的なこと
 
[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック
[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック
[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック
 
かわいい女の子になりたいんや! UE4の最新機能を使ってVTuberしてみた!
かわいい女の子になりたいんや! UE4の最新機能を使ってVTuberしてみた!かわいい女の子になりたいんや! UE4の最新機能を使ってVTuberしてみた!
かわいい女の子になりたいんや! UE4の最新機能を使ってVTuberしてみた!
 
UE4における大規模背景制作事例 最適化ワークフロー編
UE4における大規模背景制作事例 最適化ワークフロー編UE4における大規模背景制作事例 最適化ワークフロー編
UE4における大規模背景制作事例 最適化ワークフロー編
 

Viewers also liked

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

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部 自作ライブラリ紹介