アニメ『ハンドシェイカー』
ハンドシェイクは握手のことですが、ハンドシェイカーになるとどんな意味になるだろうと思ってalcで調べました。
handshaker
【名】
やけに愛想の良い人、おべんちゃらを言う人
(英辞郎 on the WEBより http://www.alc.co.jp/)
いい意味じゃないんですねえ。
アニメの方ですが「握手」というよりは、手をつなぐ方のようです。3Dアニメですが、すごく細かいところまで動いています。クラスルームのモブたちの動きが、細かすぎて普通に面白いです。
歯車がたくさん出てきます。主人公たちが武器として使っています。
では歯車たくさん作ってみます。
今回は「Blenderで歯車を作る」で作成した歯車とは違うタイプのこんな形の歯車を作ります。
一つの歯車を作成する関数名を、create_gearと名づけました。
def create_gear(num, s1, s2, s3,name):
numは、ギア数/4を指定し、s1,s2,s3は円の要になる各円の縮小率、nameはギアの名前(文字列)です。
関数の中の処理は、「Blenderで歯車を作る」で作成したスクリプトを使います。
def create_gear(num, s1, s2, s3,name): bpy.ops.mesh.primitive_circle_add(vertices=num*4) bpy.ops.object.mode_set(mode='EDIT') bpy.ops.mesh.select_mode(type='EDGE') mesh=bmesh.from_edit_mesh(bpy.context.object.data) bpy.ops.mesh.select_all(action='DESELECT') for i in range(0,num): mesh.edges[i*4].select = True bpy.ops.transform.resize(value=(s1,s1,s1)) bpy.ops.object.mode_set(mode='OBJECT') bpy.ops.mesh.primitive_circle_add() bpy.ops.transform.resize(value=(s2,s2,s2)) bpy.data.objects["Circle"].select = True bpy.ops.object.join() bpy.ops.object.mode_set(mode='EDIT') bpy.ops.mesh.select_mode(type='EDGE') bpy.ops.mesh.select_all(action='SELECT') bpy.ops.mesh.fill()
これをこのように呼び出しすれば、
create_gear(64, 0.95, 0.9, 0.1,"Gear")
以下のような絵ができます。要するに軸の穴を拡げただけです。
さらに関数内に処理を追加します。
num=16 bpy.ops.mesh.primitive_circle_add(vertices=num*4) bpy.ops.transform.resize(value=(s2,s2,s2)) bpy.ops.object.mode_set(mode='EDIT') bpy.ops.mesh.select_mode(type='EDGE') mesh=bmesh.from_edit_mesh(bpy.context.object.data) bpy.ops.mesh.select_all(action='DESELECT') for i in range(0,num): mesh.edges[i*4].select = True s3=0.1 bpy.ops.transform.resize(value=(s3,s3,s3)) bpy.ops.mesh.select_all(action='SELECT') bpy.ops.mesh.fill()
最初の歯車作成の処理と同じような処理ですが、縮尺が異なります。このような絵ができます。

後は外側の歯車と、内側の歯車を組み合わせて、こうなります。
ランダムにたくさん作るスクリプトです。
1 #!/bin/bash
2 cat <<EOL>/tmp/tmp.py
3
4 import bpy,bmesh,random
5
6 yellow=bpy.data.materials.new("yellow")
7 yellow.diffuse_color=(1, 0.82, 0.0)
8 yellow.emit=0.3
9
10 bpy.ops.object.delete()
11
12 def create_gear(num, s1, s2, s3,name):
13 bpy.ops.mesh.primitive_circle_add(vertices=num*4)
14
15 bpy.ops.object.mode_set(mode='EDIT')
16 bpy.ops.mesh.select_mode(type='EDGE')
17
18 mesh=bmesh.from_edit_mesh(bpy.context.object.data)
19
20 bpy.ops.mesh.select_all(action='DESELECT')
21 for i in range(0,num):
22 mesh.edges[i*4].select = True
23 bpy.ops.transform.resize(value=(s1,s1,s1))
24
25 bpy.ops.object.mode_set(mode='OBJECT')
26 bpy.ops.mesh.primitive_circle_add()
27 bpy.ops.transform.resize(value=(s2,s2,s2))
28
29 bpy.data.objects["Circle"].select = True
30 bpy.ops.object.join()
31 bpy.ops.object.mode_set(mode='EDIT')
32 bpy.ops.mesh.select_mode(type='EDGE')
33 bpy.ops.mesh.select_all(action='SELECT')
34 bpy.ops.mesh.fill()
35
36 bpy.ops.object.mode_set(mode='OBJECT')
37 num=16
38 bpy.ops.mesh.primitive_circle_add(vertices=num*4)
39 bpy.ops.transform.resize(value=(s2,s2,s2))
40 bpy.ops.object.mode_set(mode='EDIT')
41 bpy.ops.mesh.select_mode(type='EDGE')
42
43 mesh=bmesh.from_edit_mesh(bpy.context.object.data)
44
45 bpy.ops.mesh.select_all(action='DESELECT')
46 for i in range(0,num):
47 mesh.edges[i*4].select = True
48
49 s3=0.1
50 bpy.ops.transform.resize(value=(s3,s3,s3))
51 bpy.ops.mesh.select_all(action='SELECT')
52 bpy.ops.mesh.fill()
53 bpy.ops.object.mode_set(mode='OBJECT')
54
55 bpy.data.objects["Circle.001"].select = True
56 bpy.ops.object.join()
57
58 bpy.ops.object.mode_set(mode='EDIT')
59 bpy.ops.mesh.select_mode(type='EDGE')
60
61 bpy.ops.mesh.extrude_region_move(
62 TRANSFORM_OT_translate={"value":(0, 0, 0.1)}
63 )
64
65 bpy.ops.object.mode_set(mode='OBJECT')
66 bpy.context.object.name=name
67 bpy.context.object.data.materials.append(yellow)
68
69 for i in range(300):
70 x=random.random()*12-6
71 y=random.random()*12-6
72 z=random.random()*4-2
73 r=random.randint(1,20)*4
74 s=random.random()
75 name = "Gear." + str(i)
76 create_gear(r, 0.95, 0.9, 0.1,name)
77 bpy.ops.transform.resize(value=(s,s,s))
78 bpy.data.objects[name].location=(x,y,z)
79
80 bpy.data.lamps['Lamp'].distance=4000
81 bpy.data.lamps['Lamp'].type='SUN'
82
83
84 EOL
85 blender -P /tmp/tmp.py


コメント