LoginSignup
8
5

More than 3 years have passed since last update.

Pythonで3DCGするならlibiglがいいですよという話

Posted at

 人間には誰しもプログラムだけで3DCGを完結させたいという願望があります。そのような時に、例えばFBXSDKなどは有力な手段となりますが、正直とっつきづらい印象があります。

image.png

 そこで、libiglを使うことをおすすめします。

 元々はC++用に開発されたライブラリですが、ありがたいことにPython用のバインディングが用意されています(FBXSDKもPythonバインディングはありますが、こちらの方が圧倒的に手軽です)。Jupyterを使ってインタラクティブに出力を確認できるのでとても便利です。

導入

 Anacondaを使います。Anacondaを使うのは趣味の問題ではなく、付属のmeshplotというライブラリがconda限定っぽいからです。pipで可能だったらすいません。以下のコマンドでインストールします。

conda install -c conda-forge igl

 あと付属もライブラリも合わせてインストールします。

conda install -c conda-forge meshplot 

 それが完了したらjupyterを起動します。

使い方

image.png

 公式チュートリアルではStanford Bunny等のサンプルを用意していますが、せっかくなのでBlenderでの操作と比較するために、Blenderで自前の素材を用意することにしましょう。

 Blenderでトーラスのメッシュを作成し、objファイルとしてエクスポートします。

image.png

 生成されたファイルを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)

 すると以下のようなプレビューが出ます。

image.png

 画像だとよくわからないと思いますが、この図形はマウスで拡大縮小したり回転させたりすることができます。便利!

 頂点やメッシュの情報にもアクセスできます。

image.png

 vは頂点座標、fは何番目の頂点を結んでポリゴンにしているかというデータです。

 早速、このデータを使ってイタズラします。

改変

 fのデータをいじります。頂点番号の内1つをずらしてみます。

for i,_ in enumerate(f):
    f[i][2] += 1

image.png

 今度は座標を歪めてみます。頂点座標をeの指数にします。


v, f = igl.read_triangle_mesh("torus.obj")
v = np.exp(v)

image.png

 おむすびみたいになりました。

 これをファイルとして出力します。

igl.write_obj("torus2.obj",v,f)

 するとフォルダにtorus2.objが生成されるはずです。

 生成されたobjをBlenderで読み込むと、変形されたメッシュが得られていることがわかります。

image.png

スクリプトでやる場合

 もちろん、このような操作はBlenderでも行うことができます。

import bpy
import numpy as np
for v in bpy.data.meshes['torus'].vertices:
    v.co = np.exp(v.co)

image.png

(※OBJフォーマットとBlenderの座標系が違うため鏡像反転になっています)

 単純な処理ならそこまでスクリプトの手間は変わらないですが、libiglの方は諸々のAPIが整備されており、何よりJupyterでデバッグしながら開発しやすいので、その点でアドバンテージがあります。

 興味を持った方はチュートリアルをやってみましょう。

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5