2024/05/05(日) [n年前の日記]
#1 [blender] blenderのカーブをobjで保存して加工したい
blender 3.6.9 x64 LTS 上で作成したカーブオブジェクト(ベジェ曲線)を、Wavefront obj形式でエクスポートして、OpenGLを使ったプログラムから利用できるようにしたい。
blenderから、一般的なモデルデータ形状を、Wavefront obj形式でエクスポートすることはできるけれど、belender上のカーブ(ベジェ曲線)は、Wavefront obj形式でエクスポートできるのだろうか…?
試してみたところ、一応エクスポートできるようだなと…。曲線を、細かい直線で近似したような状態にしてエクスポートしてくれる。
ただ、直線の長さがバラバラで、そのままではプログラムから扱いづらい。
できれば一定の間隔で頂点が配置されてる状態にしたい。以下の作業をすることで、調整できるか試してみた。
テストで使った .obj は以下。
_curve.obj
まず、Wavefront obj形式をcsvにするPythonスクリプト、lineobj2csv.py を書いてみた。このスクリプトは、x,y,z のうち、x,z だけを出力する。
_lineobj2csv.py
得られた csv は以下。
_curve2.csv
この csvを、Python + matplotlib で表示して、頂点の状態を確認してみる。
_draw_line_plot.py
頂点の間隔がバラバラで、しっくりこない。
Python + scipy で、スプライン曲線にして、頂点の間隔を調整する。
_dump_spline.py
得られたcsvは以下。
_curve3_spline.csv
得られたcsvを、Python + matplotlib で表示してみる。頂点の間隔が調整された。
_draw_line_plot.py
こうして得られたcsvを、Pythonスクリプトに渡して、Wavefront obj形式に変換する。ちなみに、csvにはx,z値しか入ってないので、y値は0.0にして出力する。
_csv2lineobj.py
得られた .obj は以下。
_curve4.obj
この .obj を blender でインポート。メッシュオブジェクト(線データ)としてインポートされる。形状がおかしくなってないか、頂点の間隔がおかしくないか確認。
こんな感じで、blender上のカーブ情報を .objでエクスポートして、Pythonスクリプトで加工して、.objにしてインポートし直すことができた。
blenderから、一般的なモデルデータ形状を、Wavefront obj形式でエクスポートすることはできるけれど、belender上のカーブ(ベジェ曲線)は、Wavefront obj形式でエクスポートできるのだろうか…?
試してみたところ、一応エクスポートできるようだなと…。曲線を、細かい直線で近似したような状態にしてエクスポートしてくれる。
ただ、直線の長さがバラバラで、そのままではプログラムから扱いづらい。
できれば一定の間隔で頂点が配置されてる状態にしたい。以下の作業をすることで、調整できるか試してみた。
- Wavefront obj形式からcsvを作成。
- csvを、Python + scipy のスクリプトで読み込んで、スプライン曲線に変換。
- スプライン曲線にしたcsvを、Pythonスクリプトで読み込んで、Wavefront obj形式に変換。
- blenderでWavefront obj形式をインポート。
テストで使った .obj は以下。
_curve.obj
まず、Wavefront obj形式をcsvにするPythonスクリプト、lineobj2csv.py を書いてみた。このスクリプトは、x,y,z のうち、x,z だけを出力する。
_lineobj2csv.py
python lineobj2csv.py -i curve.obj > curve2.csv
得られた csv は以下。
_curve2.csv
この csvを、Python + matplotlib で表示して、頂点の状態を確認してみる。
_draw_line_plot.py
python draw_line_plot.py curve2.csv
頂点の間隔がバラバラで、しっくりこない。
Python + scipy で、スプライン曲線にして、頂点の間隔を調整する。
_dump_spline.py
python dump_spline.py -i curve2.csv -n 1 > curve3_spline.csv
得られたcsvは以下。
_curve3_spline.csv
得られたcsvを、Python + matplotlib で表示してみる。頂点の間隔が調整された。
_draw_line_plot.py
python draw_line_plot.py curve3_spline.csv
こうして得られたcsvを、Pythonスクリプトに渡して、Wavefront obj形式に変換する。ちなみに、csvにはx,z値しか入ってないので、y値は0.0にして出力する。
_csv2lineobj.py
python csv2lineobj.py -i curve3_spline.csv > curve4.obj
得られた .obj は以下。
_curve4.obj
この .obj を blender でインポート。メッシュオブジェクト(線データ)としてインポートされる。形状がおかしくなってないか、頂点の間隔がおかしくないか確認。
こんな感じで、blender上のカーブ情報を .objでエクスポートして、Pythonスクリプトで加工して、.objにしてインポートし直すことができた。
◎ メッシュからカーブへの変換 :
余談。インポートした線データは、メッシュオブジェクトになっている。カーブ情報に変換したい時は、以下のどちらかの操作をする。
そのままだと連続した直線データになっている。曲線にしたい時は、更に以下の操作をする。
これで各頂点にハンドルがついて、曲線になってくれる。
- オブジェクト → 変換 → カーブ、を選ぶ。
- もしくは、右クリックして、変換 → カーブ。
そのままだと連続した直線データになっている。曲線にしたい時は、更に以下の操作をする。
- カーブを選んで、TABキーを叩いて編集モード(頂点編集モード)に入る。
- Aキーを何度か叩いて、全頂点を選択。
- 右クリックして、スプラインタイプを設定 → ベジエ、を選ぶ。
- 右クリック → ハンドルタイプ設定 → 自動、を選ぶ。
これで各頂点にハンドルがついて、曲線になってくれる。
◎ 2024/05/06追記 :
頂点の間隔を等間隔にしたいだけなら、LoopToolsアドオンを有効にして、「Space」をクリックするだけで済むと知った。上記のような面倒なことはしなくていい…。
[ ツッコむ ]
以上です。