Blenderでパーティクル炒飯

bl-friedrice-001
ドラマ『侠飯』
ヤクザの抗争に巻き込まれてしまったことで、組長を自分のアパートでかくまうはめになってしまった大学生、良太。組長は毎回魅惑の料理を良太にも作るのですが、黙って食べる組長に対して、うっまーを連発する良太の食べっぷりがいいです。美味しそうに食べます。私が一番食べたかったのは、第2話の「焦がし醤油の大蒜炒飯」。ということで、Blenderで作ってみます。

まずは、米から作ります。diffuse_colorで卵の色をつけて、emitで光らせておきます。この米は、パーティクルのオブジェクトになるので直接レンダリングはしませんので、別レイヤーにします。

import bpy

def layers(l):
    all = [False]*20
    all[l]=True
    return all

yellow=bpy.data.materials.new("test")
yellow.diffuse_color=(1, 0.9, 0.1)
yellow.use_cast_shadows=True
yellow.emit=0.7

bpy.ops.mesh.primitive_uv_sphere_add()
bpy.ops.transform.resize(value=(0.2, 0.1, 0.4))

bpy.context.object.data.materials.append(yellow)
bpy.data.objects['Sphere'].layers = layers(1)

EOL
blender -P /tmp/tmp.py

bl-friedrice-002

テーブルと、皿を作ります。テーブルは赤色、皿は炒飯黄色が映えそうな黒にします。

bpy.data.materials['Material'].diffuse_color=(1, 0, 0)
bpy.data.objects['Cube'].location=(0,0,-1)
bpy.ops.transform.resize(value=(9,9,1))

black=bpy.data.materials.new("test2")
black.diffuse_color=(0, 0, 0)
black.raytrace_mirror.use=True
black.raytrace_mirror.reflect_factor=0.02

bpy.ops.mesh.primitive_cylinder_add()
bpy.ops.transform.resize(value=(1, 1, 0.01))
bpy.context.object.data.materials.append(black)

bl-friedrice-003

球体を歪めて、皿の上に置きます。

bpy.ops.mesh.primitive_uv_sphere_add()
bpy.context.object.data.materials.append(yellow)
bpy.ops.transform.resize(value=(0.4, 0.4, 0.2))
bpy.data.objects['Sphere.001'].location=(0, 0, 0.2)
bpy.ops.object.shade_smooth()

bpy.ops.object.particle_system_add()

bpy.data.particles['ParticleSettings'].effector_weights.gravity=0.9
bpy.data.particles['ParticleSettings'].effector_weights.force=0.300
bpy.data.particles['ParticleSettings'].render_type='OBJECT'
bpy.data.particles['ParticleSettings'].dupli_object=bpy.data.objects['Sphere']

この物体から焼き飯が生成されます。
bl-friedrice-004

ALT+Aを押すと、このように米が浮き出てきます。インスタントラーメンのようです。
bl-friedrice-005

まとめるとこのようなスクリプトになります。

~$ cat -n friedrice.sh
     1	#!/bin/bash
     2	cat <<EOL>/tmp/tmp.py
     3	
     4	import bpy
     5	
     6	def layers(l):
     7	    all = [False]*20
     8	    all[l]=True
     9	    return all
    10	
    11	yellow=bpy.data.materials.new("test")
    12	yellow.diffuse_color=(1, 0.9, 0.1)
    13	yellow.use_cast_shadows=True
    14	yellow.emit=0.7
    15	
    16	black=bpy.data.materials.new("test2")
    17	black.diffuse_color=(0, 0, 0)
    18	black.raytrace_mirror.use=True
    19	black.raytrace_mirror.reflect_factor=0.02
    20	
    21	bpy.data.materials['Material'].diffuse_color=(1, 0, 0)
    22	
    23	bpy.data.objects['Cube'].location=(0,0,-1)
    24	bpy.ops.transform.resize(value=(9,9,1))
    25	
    26	bpy.ops.mesh.primitive_uv_sphere_add()
    27	bpy.ops.transform.resize(value=(0.2, 0.1, 0.4))
    28	bpy.context.object.data.materials.append(yellow)
    29	bpy.data.objects['Sphere'].layers = layers(1)
    30	
    31	bpy.ops.mesh.primitive_uv_sphere_add()
    32	bpy.context.object.data.materials.append(yellow)
    33	bpy.ops.transform.resize(value=(0.4, 0.4, 0.2))
    34	bpy.data.objects['Sphere.001'].location=(0, 0, 0.2)
    35	bpy.ops.object.shade_smooth()
    36	
    37	bpy.ops.object.particle_system_add()
    38	
    39	bpy.data.particles['ParticleSettings'].effector_weights.gravity=0.9
    40	bpy.data.particles['ParticleSettings'].effector_weights.force=0.300
    41	bpy.data.particles['ParticleSettings'].render_type='OBJECT'
    42	bpy.data.particles['ParticleSettings'].dupli_object=bpy.data.objects['Sphere']
    43	bpy.data.particles['ParticleSettings'].use_rotations = True
    44	bpy.data.particles['ParticleSettings'].rotation_factor_random=1
    45	bpy.data.particles['ParticleSettings'].count=500000
    46	
    47	bpy.ops.mesh.primitive_cylinder_add()
    48	bpy.ops.transform.resize(value=(1, 1, 0.01))
    49	bpy.context.object.data.materials.append(black)
    50	
    51	bpy.data.lamps['Lamp'].type='SUN'
    52	
    53	EOL
    54	blender -P /tmp/tmp.py

bl-friedrice-006

Leave a Reply

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

CAPTCHA