Go その2 Advent Calendar 2015 の22日目です。
はじめに
仕事で作ったGoで3Dモデルデータを変換処理するマイクロサービスをGoで書いた話です。
どんなもの?
- Sketchfabみたいに3DモデルファイルをアップロードしてWebGLで描画するものです。
- OBJやFBX, DAE, 3DS, MA, BLEND, ZIPをアップロードし、Web上で見ることができます
- 社内のマイクロサービスとして自社内の様々なWebサービスから利用することを想定しています。
The Go gopher was designed by Renee French. (http://reneefrench.blogspot.com/) The gopher 3D model was made by Takuya Ueda (http://u.hinoichi.net). Licensed under the Creative Commons 3.0 Attributions license.
作るきっかけ
「制作時に他人の作った3Dモデルをツールを立ちあげなくてもWebでサクッと確認したい」「ツール持ってない人でも確認できるようにしたい」ユーザーのニーズに応えるためです。
似たようなサービスはあるのですが、toB向けじゃなかったりアップロードしてから見れるまで遅かったりで苦しみがありました。
※ UnityWebPlayerでも良いのですが、主要なブラウザでNPAPIが無効化されてしまいます。
プライバシーが担保されて高速な3D変換処理が必要だったわけです。
また、せっかく作るなら、というわけで他のサービスで使えるようにAPIエンドポイントを設定したマイクロサービスにしました。
使った技術
- go1.5 Go
- Revel GoのMVCフレームワーク
- GORM GoのORマッパ
- three.js 3DモデルをWebGL表示する
- assimp2json 3DファイルをAssimp形式のJSONへ変換する
やること
- 3dファイルをアップロードする
- 3dファイルをAssimpに変換する
- S3に送る
- WebGLPlayerで表示
提供API
- ファイルをアップロードするPOST API
- 対象ファイルのワンタイムパスを取得するGET API
- 対象ファイルをロードしたPlayerのiframeを取得するGET API
結果
- アップロードから表示まで10MB程度なら2秒ぐらいで表示できる
- メモリ使用量15MB〜80MB程度
実際のサービス画面
The Go gopher was designed by Renee French. (http://reneefrench.blogspot.com/) The gopher 3D model was made by Takuya Ueda (http://u.hinoichi.net). Licensed under the Creative Commons 3.0 Attributions license.
その他
- zip内にテクスチャ画像があったら貼るようにした。StringユーティリティやZip再帰当たりは自作
- マイクロサービスするぐらいは1週間でできるが、本体のWebサービス(Rails)に組み込むのに3週間ぐらいかかった。