人間には誰しもプログラムだけで3DCGを完結させたいという願望があります。そのような時に、例えばFBXSDKなどは有力な手段となりますが、正直とっつきづらい印象があります。
そこで、libiglを使うことをおすすめします。
元々はC++用に開発されたライブラリですが、ありがたいことにPython用のバインディングが用意されています(FBXSDKもPythonバインディングはありますが、こちらの方が圧倒的に手軽です)。Jupyterを使ってインタラクティブに出力を確認できるのでとても便利です。
導入
Anacondaを使います。Anacondaを使うのは趣味の問題ではなく、付属のmeshplot
というライブラリがconda限定っぽいからです。pipで可能だったらすいません。以下のコマンドでインストールします。
conda install -c conda-forge igl
あと付属もライブラリも合わせてインストールします。
conda install -c conda-forge meshplot
それが完了したらjupyterを起動します。
使い方
公式チュートリアルではStanford Bunny等のサンプルを用意していますが、せっかくなのでBlenderでの操作と比較するために、Blenderで自前の素材を用意することにしましょう。
Blenderでトーラスのメッシュを作成し、obj
ファイルとしてエクスポートします。
生成されたファイルをjupyterで開いたフォルダに入れます。ここではtorus.obj
としています。
jupyterで以下の命令を打ちます。
import igl
import scipy as sp
import numpy as np
from meshplot import plot, subplot, interact
v, f = igl.read_triangle_mesh("torus.obj")
plot(v, f)
すると以下のようなプレビューが出ます。
画像だとよくわからないと思いますが、この図形はマウスで拡大縮小したり回転させたりすることができます。便利!
頂点やメッシュの情報にもアクセスできます。
v
は頂点座標、f
は何番目の頂点を結んでポリゴンにしているかというデータです。
早速、このデータを使ってイタズラします。
改変
f
のデータをいじります。頂点番号の内1つをずらしてみます。
for i,_ in enumerate(f):
f[i][2] += 1
今度は座標を歪めてみます。頂点座標をeの指数にします。
v, f = igl.read_triangle_mesh("torus.obj")
v = np.exp(v)
おむすびみたいになりました。
これをファイルとして出力します。
igl.write_obj("torus2.obj",v,f)
するとフォルダにtorus2.obj
が生成されるはずです。
生成されたobj
をBlenderで読み込むと、変形されたメッシュが得られていることがわかります。
スクリプトでやる場合
もちろん、このような操作はBlenderでも行うことができます。
import bpy
import numpy as np
for v in bpy.data.meshes['torus'].vertices:
v.co = np.exp(v.co)
(※OBJフォーマットとBlenderの座標系が違うため鏡像反転になっています)
単純な処理ならそこまでスクリプトの手間は変わらないですが、libiglの方は諸々のAPIが整備されており、何よりJupyterでデバッグしながら開発しやすいので、その点でアドバンテージがあります。
興味を持った方はチュートリアルをやってみましょう。