はじめに
今回は,Paraviewで生成したopenFOAMの結果のx3dファイルをBlenderで読み込む
Blender での読み込み
読み込むと,以下のオブジェクトが生成される。
- DirectLight.xxx
- Shape_IndexedFaceSet
- Viewpoint
このうち,流体の箇所を表すのは,Shape_IndexedFaceSetであり,ほかのものはいらない。
ちなみに,Viewpointは,x3dを出力した際のParaviewでの視点となっている.
Blender Scriptによる複数データの読み込み
GUIからx3dファイルを読み込む場合は,複数ファイルを読み込むことができないため,pythonでデータを読み込むこととする。
以下のスクリプトでは,ファイルを読み込み,読み込まれたもののうち,オブジェクトのタイプがMESH以外のもの(上記で説明した視点やライトのオブジェクト)を削除している.
import glob
import bpy
from pathlib import Path
TARGET_DIRECTORY=r"C:\GithubData\OpenFOAM_Vis_Blender\cal_data\PV_x3d"
#TARGET_DIRECTORYに保存されているx3dファイルを読み込む
lists = Path(TARGET_DIRECTORY).glob("*.x3d")
for fullPath in list(lists):
bpy.ops.import_scene.x3d(filepath=str(fullPath))
#MESH以外を削除
for i in bpy.data.objects:
print(i.type)
if i.type != "MESH":
print("del")
bpy.data.objects.remove(i, do_unlink=True)
これで読み込むと以下のように,各ステップのメッシュが表示されるはず.
キーを打つ
Blenderでアニメーションを生成できるように,各オブジェクトにキーフレームを設定する。
ここでは,5フレーム(dt)ごとに表示させるobjectを切り替えている。
import bpy
def on_of_setanimation(ob, t):
bpy.context.scene.frame_set(0)
ob.hide_viewport = True
ob.hide_render = True
ob.keyframe_insert(data_path="hide_viewport")
ob.keyframe_insert(data_path="hide_render")
bpy.context.scene.frame_set(t[0])
ob.hide_viewport = False
ob.hide_render = False
ob.keyframe_insert(data_path="hide_viewport")
ob.keyframe_insert(data_path="hide_render")
bpy.context.scene.frame_set(t[1])
ob.hide_viewport = True
ob.hide_render = True
ob.keyframe_insert(data_path="hide_viewport")
ob.keyframe_insert(data_path="hide_render")
obs = bpy.data.objects
t0 = 0
dt = 5
for i, ob in enumerate(obs):
if ob.type == "MESH":
t = [dt*i, dt*(i+1)]
on_of_setanimation(ob, t)