Blenderで歯車たくさん

12-7.Blender


アニメ『ハンドシェイカー』

ハンドシェイクは握手のことですが、ハンドシェイカーになるとどんな意味になるだろうと思って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

コメント

タイトルとURLをコピーしました