最近はUnityやらARKitやら、Blenderを触っていてだいぶ3D慣れしてきました。
objファイルをブラウザからアップロードし、そのファイルで定義された3Dオブジェクトのスクリーンショットを表示したいという要望があり、いろいろと方法を調べたところ、サーバー側でBlenderを動かしてobjファイルをインポートしてレンダリングすればできるということがわかりました。その手順を紹介します。
まずサーバーにBlenderをインストールします。2018/1/11時点で最新の2.79をインストールするため、最新のパッケージを含んでいるレポジトリをadd-apt-repositoryで追加してからapt-getでインストールします。
% sudo add-apt-repository ppa:thomas-schiex/blender
% sudo apt-get update
% sudo apt-get install blender
参考 http://ubuntuhandbook.org/index.php/2017/09/blender-2-79-released-install-it-in-ubuntu/
BlenderはGUIで操作する3DCGソフトなのですが、操作内容をPythonで書くことができ、コマンドラインから実行することができます。
以下が、「--」以降の第1引数で指定した.objファイルを読み込み、第2引数で指定した.pngファイルにレンダリングしたイメージを書き出します。この.pngファイルがスクリーンショットになります。
Blenderを起動するとデフォルトでライトとカメラ、立方体のサンプルのオブジェクトが表示されるので、以下の命令で立方体のサンプルを削除しています。
bpy.data.objects.remove(bpy.data.objects['Cube'])
以下のようにして、Blenderをコマンドラインで呼び出します。
% blender --python import_obj.py -- cone.obj cone.png
--pythonオプションの後に、pythonスクリプトimport_obj.pyを指定し、-- 以降、第1引数にcone.objを指定し、第2引数に書き出す画像ファイルcone.pngを指定しています。
cone.objは円錐の3Dオブジェクトの頂点データを持っています。
上記コマンドで書き出されるcone.pngは以下の通りです。
上記import_obj.pyは一つの.objファイルを読み込むだけの非常にシンプルなスクリプトでした。複数の.objファイルを読み込んだり、マテリアルを適用したり、カメラの角度やライトの当て方を変えるPythonのコードを追加することで自在に3Dオブジェクトのキャプチャを取ることができます。
2018/01/11 09:00:00