Blenderで歯車を作る


アニメ『幼女戦記』
兵士たちが銃を持って空を駆け回ります。なんだか戦い方がモビルスーツです。編隊を組んで飛行してくる兵士たちがザクにしか見えません。外見は幼女そのものの主人公、ターニャ・フォン・デグレチャフの強さは圧倒的です。ターニャ1人にザク達は壊滅させられます。もう戦い方がニュータイプです。1話目は特に引き込まれる要素がなかったのですが、このアニメ2話目めちゃめちゃ面白いです。ターニャがどうなっていくのかとても楽しみになりました。
ところでターニャが大爆発を引き起こす銃弾を打つとき、宙に魔王陣が投影されると、まるで機械仕掛けで放出エネルギーを集めているかのようにたくさんの歯車が現れます。魔法がどういう仕組みかはよくわかりませんが、この一瞬登場する歯車、腕時計の中の歯車みたいでカッコいいです。

では歯車バンザイということで、Blenderで歯車作ります。

準備するもの
  • Linux PC(確認環境はDebian 8.3 Jessie)
  • 端末ウィンドウ(ターミナルソフト)
  • Blender(確認環境はv2.72)

いつものごとく最初のCubeは削除して、代わりにCircleを使います。頂点数は歯数に比例してます。極端に少ないと歯車に見えません。ここでは64個にしました。

bpy.ops.mesh.primitive_circle_add(vertices=64)


モードを編集モードに変更し、edge選択モードにします。そして一旦すべて非選択にします。

bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_mode(type='EDGE')
bpy.ops.mesh.select_all(action='DESELECT')

次に4つ飛ばしで辺(edge)を選択していきます。

for i in range(0,16):
	mesh.edges[i*4].select = True


一周すべて選択し終わったら縮小します。これで歯車の輪郭ができます。

bpy.ops.transform.resize(value=(0.8, 0.8, 0.8))

今度は歯車の軸用の穴です。これも円でつくります。
オブジェクトモードに戻し、円の追加をして縮小します。

bpy.ops.object.mode_set(mode='OBJECT')
bpy.ops.mesh.primitive_circle_add()
bpy.ops.transform.resize(value=(0.1,0.1,0.1))


最初に作った歯車の輪郭と、2番めに作った軸の穴を結合します。
最初に作った歯車の輪郭オブジェクトはCircleいうデフォルト名ですので、この名称を使ってオブジェクト選択し、join()を実行すれば、2つのオブジェクトが結合して一つになります。

bpy.data.objects["Circle"].select = True
bpy.ops.object.join()


今はただの線が2つあるだけですので、この2つの間に面を張ります。再度編集モードにして、edge選択、今度はすべての辺(edge)を選択して、fill()を実行します。

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()


後はextrudeで厚みをもたせれば完成です。

bpy.ops.mesh.extrude_region_move(
    TRANSFORM_OT_translate={"value":(0, 0, 0.2)}
)

最終的に出来上がったソースはこれです。

     1	#!/bin/bash
     2	cat <<EOL>/tmp/tmp.py
     3	
     4	import bpy,bmesh
     5	
     6	bpy.ops.object.delete()
     7	
     8	num=16
     9	bpy.ops.mesh.primitive_circle_add(vertices=num*4)
    10	
    11	bpy.ops.object.mode_set(mode='EDIT')
    12	bpy.ops.mesh.select_mode(type='EDGE')
    13	
    14	mesh=bmesh.from_edit_mesh(bpy.context.object.data)
    15	
    16	bpy.ops.mesh.select_all(action='DESELECT')
    17	for i in range(0,num):
    18		mesh.edges[i*4].select = True
    19	s=0.85
    20	bpy.ops.transform.resize(value=(s,s,s))
    21	
    22	bpy.ops.object.mode_set(mode='OBJECT')
    23	bpy.ops.mesh.primitive_circle_add()
    24	s=0.1
    25	bpy.ops.transform.resize(value=(s,s,s))
    26	
    27	bpy.data.objects["Circle"].select = True
    28	bpy.ops.object.join()
    29	
    30	bpy.ops.object.mode_set(mode='EDIT')
    31	bpy.ops.mesh.select_mode(type='EDGE')
    32	bpy.ops.mesh.select_all(action='SELECT')
    33	bpy.ops.mesh.fill()
    34	
    35	bpy.ops.mesh.extrude_region_move(
    36	    TRANSFORM_OT_translate={"value":(0, 0, 0.2)}
    37	)
    38	
    39	bpy.data.lamps['Lamp'].distance=3000
    40	bpy.data.lamps['Lamp'].type='SUN'
    41	
    42	EOL
    43	blender -P /tmp/tmp.py

以下のような歯車ができます。

コメント

  1. […] ← Blenderで歯車を作る […]

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