Blenderで立体文字

blender-hello
引数で文字列を与えたら#でバナーを表示してくれる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ですが、形を平らに伸ばして、地面として使います。

blender-box-flat

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)
~$ 

blender-flat
水平方向に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)
~$ 

blender-mono

次はカメラと光源の位置(8,9行目)を変更します。
blender-objects

~$ 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

カメラが近いと、文字列が紙のようにぺらぺらなのがわかります。
blender-textflat

紙のような文字列に幅を持たせるには、extrudeの値(10行目)を変更します。
ついでにマテリアル(11〜13行目)で色を付けます。

mako@deb83:~/blen$ 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

blender-textgreen

画像が少し暗いので、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で、以下の画像が生成されます。

blender-blbanner

One response to “Blenderで立体文字

  1. Hi, I do ƅeliеve this is a grеat site. I stumbledupon it 😉 I’m going to come back once again since I booҝmarked it.
    Money and freedom is the bеst wаy to cһange, may үou be rich and continue to guide other peoplе.

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA