引数で文字列を与えたら#でバナーを表示してくれるsysvbannerに倣い、文字列を与えたら立体の文字列画像を生成してくれるコマンドを作りたいと思います。
書式はこれで。
blbanner 文字列
まず、「コマンドラインでBlender」で作成したblコマンドをベースにしますので、コピーします。
$ cp bl blbanner $ cat -n blbanner 1 #!/bin/bash 2 cat <<EOL>/tmp/tmp.py 3 import bpy 4 bpy.data.objects['Cube'].select = True 5 bpy.ops.object.delete() 6 $1 7 EOL 8 blender -b -P /tmp/tmp.py -o //test -F PNG -x 1 -f 1 | grep ^Save
4,5で削除していたCubeですが、形を平らに伸ばして、地面として使います。
blbannerはこのように修正しました。このまま実行してみます。
$ cat -n blbanner 1 #!/bin/bash 2 cat <<EOL>/tmp/tmp.py 3 import bpy 4 bpy.data.objects['Cube'].select = True 5 bpy.ops.transform.resize(value=(9,9,1)) 6 $1 7 EOL 8 blender -b -P /tmp/tmp.py -o //test -F PNG -x 1 -f 1 | grep ^Save $ ./blbanner Saved: test0001.png Time: 00:01.80 (Saving: 00:00.31) ~$
水平方向に9倍にしたCubeの上面が見えていますね。
次は立体の文字列を配置します。
6行目をtext_addメソッドに置き換えました。さらに 角度をラジアン指定するためにmath.piを使います(import mathします)。
さらにもう一つ。Cubeの位置を下げないと文字列が埋まってしまい見えなくなりますので、7行目に位置下げを追加しました。
$ cat -n blbanner 1 #!/bin/bash 2 cat <<EOL>/tmp/tmp.py 3 import bpy,math 4 bpy.data.objects['Cube'].select = True 5 bpy.ops.transform.resize(value=(9,9,1)) 6 bpy.ops.object.text_add(rotation=(math.pi/2,0,0)) 7 bpy.data.objects['Cube'].location=(0,0,-1) 8 EOL 9 blender -b -P /tmp/tmp.py -o //test -F PNG -x 1 -f 1 | grep ^Save $ ./blbanner Saved: test0001.png Time: 00:01.80 (Saving: 00:00.31) ~$
次はカメラと光源の位置(8,9行目)を変更します。
~$ cat -n blbanner 1 #!/bin/bash 2 cat <<EOL>/tmp/tmp.py 3 import bpy,math 4 bpy.data.objects['Cube'].select = True 5 bpy.ops.transform.resize(value=(9,9,1)) 6 bpy.ops.object.text_add(rotation=(math.pi/2,0,0)) 7 bpy.data.objects['Cube'].location=(0,0,-1) 8 bpy.data.objects['Camera'].location=(4,-2,1.8) 9 bpy.data.objects['Lamp'].location=(3,-4,5) 10 EOL 11 blender -b -P /tmp/tmp.py -o //test -F PNG -x 1 -f 1 | grep ^Save
カメラが近いと、文字列が紙のようにぺらぺらなのがわかります。
紙のような文字列に幅を持たせるには、extrudeの値(10行目)を変更します。
ついでにマテリアル(11〜13行目)で色を付けます。
~$ cat -n blbanner 1 #!/bin/bash 2 cat <<EOL>/tmp/tmp.py 3 import bpy,math 4 bpy.data.objects['Cube'].select = True 5 bpy.ops.transform.resize(value=(9,9,1)) 6 bpy.ops.object.text_add(rotation=(math.pi/2,0,0)) 7 bpy.data.objects['Cube'].location=(0,0,-1) 8 bpy.data.objects['Camera'].location=(4,-2,1.8) 9 bpy.data.objects['Lamp'].location=(3,-4,5) 10 bpy.data.curves['Text'].extrude=0.2 11 green=bpy.data.materials.new("test") 12 green.diffuse_color=(0,1,0) 13 bpy.data.objects['Text'].data.materials.append(green) 14 EOL 15 blender -b -P /tmp/tmp.py -o //test -F PNG -x 1 -f 1 | grep ^Save
画像が少し暗いので、Lampのdistanceを変更して光を強くします(15行目)。
最後に、引数$1で指定した文字列が立体になるようにbodyをセット(14行目)したら出来上がりです。
~$ cat -n blbanner 1 #!/bin/bash 2 cat <<EOL>/tmp/tmp.py 3 import bpy,math 4 bpy.data.objects['Cube'].select = True 5 bpy.ops.transform.resize(value=(9,9,1)) 6 bpy.ops.object.text_add(rotation=(math.pi/2,0,0)) 7 bpy.data.objects['Cube'].location=(0,0,-1) 8 bpy.data.objects['Camera'].location=(4,-2,1.8) 9 bpy.data.objects['Lamp'].location=(3,-4,5) 10 bpy.data.curves['Text'].extrude=0.2 11 green=bpy.data.materials.new("test") 12 green.diffuse_color=(0,1,0) 13 bpy.data.objects['Text'].data.materials.append(green) 14 bpy.data.objects['Text'].data.body="$1" 15 bpy.data.lamps['Lamp'].distance=2000 16 EOL 17 blender -b -P /tmp/tmp.py -o //test -F PNG -x 1 -f 1 | grep ^Save
~$ blbanner Commandで、以下の画像が生成されます。
コメント