DALAB情報発信用ブログ:OpenCAE+GPGPU+Peridynamics編

DALABで行っている研究活動の中で、OpenCAEやGPGPUや破壊解析の取り組みについてまとめてゆきます。

DEXCS2012-Salomeの有効活用:物理シミュレーションの導入手順(1)

2013年07月07日 09時40分40秒 | OpenCAE活用
ここでは少し趣を変えて、物理シミュレーションを試してみます。これまでSalome-Mecaなどで、定量的な分析を目的とした数値シミュレーションを進めてきました。一方で、定性的な現象を表現することに注目して、3次元CGなどの分野では、物理シミュレーションによるアニメーション作成が可能です。ここでは、DEXCSのAdventureやOpenFOAMの形状モデリングツールとして利用したBlenderを活用して、物理シミュレーションを実現する環境を構築します。

ここでは、あくまでBlenderを物理シミュレーションの演算エンジンとして利用するため、マウス操作などは一切省いて、入力スクリプトから動画ファイルを生成する方法を説明します。実は、この手順は以下の「まるちゃんブログ:Blenderの物理シミュレーションをpythonスクリプトで作成」を参考にしてDEXCS(Ubuntu)用に書き換えました。
http://d.hatena.ne.jp/cflat-inc/20130630/1372568992

ところで、DEXCS-Salomeはオープンソース構造解析Salome-Mecaを中心に構築された、オールインワンのオープンCAEシステムですが、要はUbuntu12.04LTS-64/32の共通のベースシステムとして、様々な活用が可能です。このブログでも色々な活用方法を紹介しています。実は、方針もなく適当に取り組んでいるのではなく、様々な構造物の最終段階の崩壊性状を知りたいという願望に従って進めています。

■ 3D-CGツールBlenderの導入

今回は、3次元CGツールのBlenderを用いて、物理シミュレーション機能を用いた定性的な崩壊の様子を動画として表現することを目標とします。まず、いつものようにSynapticを用いて、Blenderを導入します。そこで、アプリケーション→システムツール→システム管理→Synapticパッケージマネージャを利用します。最初に利用者のパスワードを入力して起動したら、左上の再読込を押してパッケージ情報を最新にします。

以下の条件で検索すると、バージョン2.62-1のblenderが見つかります。しかし物理シミュレーションは、なるべく最新版を使った方が良く、以下の入力スクリプトもバージョン2.66以上を前提としているようです。
検索:blender 結果:blender blender-dbg バージョン2.62-1

そこで、以下のBlender公式ダウンロードサイトから、最新版バージョン2.67bを入手してインストールしてみます。以下のサイトの、Linux-x86-64の項目から、「Blender 2.67b (73 MB)」をダウンロードします。
http://www.blender.org/download/get-blender/

入手したファイルは、~/Downloadsの中の、blender-2.67b-linux-glibc211-x86_64.tar.bz2です。以下の手順で確認して展開します。
$ cd ~/Downloads; ls
$ bzip2 -d blender-2.67b-linux-glibc211-x86_64.tar.bz2
$ tar xvf blender-2.67b-linux-glibc211-x86_64.tar
$ cd blender-2.67b-linux-glibc211-x86_64; ls

色々なファイルがありますが、readme.htmlがあるので、メニューバーの場所→ホームフォルダーから、このファイルを選択してブラウザで内容を確認します。Installationの項目を見ると、Linux,FreeBSDでは展開すれば実行形式が実行可能となります。コンパイルなどは不要なので、/optに移動して、以下の手順でそのまま実行するようにします。
$ cd ..
$ mv blender-2.67b-linux-glibc211-x86_64 /opt/blender

■ 物理シミュレーションの準備

端末を開いてアプリケーション→アクセサリ→端末を開いて、Blenderを物理シミュレーションツールとして利用するための設定を行います。と言っても、要は3D-CGツールの画面を出さずに、入力スクリプトを読み込んで動作するようにします。

$ vi ~/.bashrc で設定ファイルを開いて、最後に以下を追加したら、sourceで設定を有効にする。
  # blender-simulator
  alias blender-simulator='/opt/blender/blender --background --python'
$ source ~/.bashrc

■ 入力スクリプトの準備

実はBlenderでは、内部の処理がpythonで構築されているため、pythonスクリプトを用意することで、マウスなどの操作を一切行わずに画像生成を進めることができます。以下では、上記のブログに示された例題について、その内容を解説します。

入力スクリプトは、~/BlenderWorkに作ることにします。ファイルsim00.pyとして、viでファイルを開いて、以下の内容をマウスでコピーして作ります。
$ cd ~
$ mkdir BlenderWork
$ cd BlenderWork
$ vi sim00.py

=====入力スクリプト:sim00.py=====
# -*- coding: utf-8 -*-

import os
import bpy
import math

#デフォルトで存在しているCubeを削除
bpy.ops.object.delete()

#Cube作成
N = 10
for x in range(0, N):
for y in range(0, N):
for z in range(0, N):
bpy.ops.mesh.primitive_cube_add(location=(x*2, y*2, z*2))
bpy.ops.rigidbody.object_add()

#平面作成
bpy.ops.mesh.primitive_plane_add(location=(N-1, N-1, -10))
bpy.ops.rigidbody.object_add(type='PASSIVE')
bpy.data.objects["Plane"].scale = (N+10, N+10, 1)

#カメラ
bpy.data.objects["Camera"].location = (N+20, N+20, N+20)
bpy.data.objects["Camera"].rotation_euler = (math.pi/6, 0, math.pi*3/4)
bpy.data.cameras["Camera"].lens = 10

#照明
bpy.data.objects["Lamp"].location = (0, 0, N+10)
bpy.data.lamps["Lamp"].type = 'SUN'

# 物理シミュレーション
bpy.ops.ptcache.bake_all()

# 動画作成
bpy.context.scene.render.resolution_x = 400
bpy.context.scene.render.resolution_y = 300
bpy.context.scene.render.resolution_percentage = 100
bpy.context.scene.render.image_settings.file_format = 'AVI_JPEG'
bpy.data.scenes["Scene"].render.filepath = "test.avi"
bpy.context.scene.frame_start = 0
bpy.context.scene.frame_end = 200
bpy.ops.render.render(animation=True)

# 保存
savePath = os.path.abspath(os.path.dirname(__file__))
bpy.path.relpath(savePath)
bpy.ops.wm.save_as_mainfile(filepath="test.blend", relative_remap=True)
======================

■ 物理シミュレーションの実行

先に設定したツールを用いて、以下のように実行します。色々なメッセージが表示されながら処理が進みます。
$ blender-simulator sim00.py

暫く待つと、「Append frame 200 Time: 00:00.27 (Saving: 00:00.05) Blender quit」が表示されたら完了です。結果を確認します。
$ ls
sim00.py:用意した入力スクリプト
test.avi:生成された動画ファイル
test.blend:Blender用の入力ファイル

さてお待ちかねの動画ファイルを確認してみます。AVIの動画ファイルは以下のコマンドで表示できます。小さなブロックで作られた大きな立方体が下の板に向かって重力落下して、バラバラに崩れ散る様子が分かると思います。
$ totem test.avi

■ 入力スクリプトの解説

この入力スクリプトは、Python言語のスクリプトなので、記述方法などもPythonに従っています。スクリプトを理解するために必要な情報を、各記述に対応してまとめておきます。

======================
⇒ # -*- coding: utf-8 -*-
スクリプトのファイルの漢字コードを指定します。ここでは、UTF-8を用いています。これがお決まりの呪文です。

⇒ import os
⇒ import bpy
⇒ import math
スクリプトで用いるライブラリを組み込みます。osはオペレーティングシステムの機能であるファイルの生成などのため、bpyはこのスクリプトで中心となるBlender用Pythonライブラリ利用のため、mathは数学関数の利用のためです。

⇒ #デフォルトで存在しているCubeを削除
⇒ bpy.ops.object.delete()
Blenderは標準の初期状態で、中央に立方体が生成されているので、まずはモデルの中のオブジェクト(物体)を全て削除しておきます。


======================

#Cube作成
N = 10
for x in range(0, N):
for y in range(0, N):
for z in range(0, N):
bpy.ops.mesh.primitive_cube_add(location=(x*2, y*2, z*2))
bpy.ops.rigidbody.object_add()

#平面作成
bpy.ops.mesh.primitive_plane_add(location=(N-1, N-1, -10))
bpy.ops.rigidbody.object_add(type='PASSIVE')
bpy.data.objects["Plane"].scale = (N+10, N+10, 1)

#カメラ
bpy.data.objects["Camera"].location = (N+20, N+20, N+20)
bpy.data.objects["Camera"].rotation_euler = (math.pi/6, 0, math.pi*3/4)
bpy.data.cameras["Camera"].lens = 10

#照明
bpy.data.objects["Lamp"].location = (0, 0, N+10)
bpy.data.lamps["Lamp"].type = 'SUN'

# 物理シミュレーション
bpy.ops.ptcache.bake_all()

# 動画作成
bpy.context.scene.render.resolution_x = 400
bpy.context.scene.render.resolution_y = 300
bpy.context.scene.render.resolution_percentage = 100
bpy.context.scene.render.image_settings.file_format = 'AVI_JPEG'
bpy.data.scenes["Scene"].render.filepath = "test.avi"
bpy.context.scene.frame_start = 0
bpy.context.scene.frame_end = 200
bpy.ops.render.render(animation=True)

# 保存
savePath = os.path.abspath(os.path.dirname(__file__))
bpy.path.relpath(savePath)
bpy.ops.wm.save_as_mainfile(filepath="test.blend", relative_remap=True)

最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。