def run(origin):
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΠΏΡΡΠΈ ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
path = bpy.data.curves.new('MyPath', 'CURVE')
pathOb = bpy.data.objects.new('Path', path)
pathOb.location = origin
bpy.context.scene.objects.link(pathOb)
# ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π΄Π°Π½Π½ΡΡ ΠΏΡΡΠΈ
path.dimensions = '3D'
path.use_path = True
path.use_path_follow = True
path.path_duration = 250
# ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΏΠ»Π°ΠΉΠ½Π° ΠΊ ΠΏΡΡΠΈ
spline = path.splines.new('POLY')
spline.use_cyclic_u = True
spline.use_endpoint_u = False
# ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΡΠ΅ΠΊ ΠΊ ΡΠΏΠ»Π°ΠΉΠ½Ρ
pointTable = [(0,0,0,0), (1,0,3,0),
(1,2,2,0), (0,4,0,0), (0,0,0,0)]
nPoints = len(pointTable)
spline.points.add(nPoints-1)
for n in range(nPoints):
spline.points[n].co = pointTable[n]
# ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Π΅Π·ΡΡΠ½Ρ
bpy.ops.mesh.primitive_monkey_add()
monkey = bpy.context.object
# ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ "ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ ΠΏΠΎ ΠΏΡΡΠΈ" ΠΎΠ±Π΅Π·ΡΡΠ½Π΅
cns = monkey.constraints.new('FOLLOW_PATH')
cns.target = pathOb
cns.use_curve_follow = True
cns.use_curve_radius = True
cns.use_fixed_location = False
cns.forward_axis = 'FORWARD_Z'
cns.up_axis = 'UP_Y'
return
if __name__ == "__main__":
run((0,0,0))
bpy.ops.screen.animation_play(reverse=False, sync=False)
ΠΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΡΠ²Π΅ΡΠ° "ΡΠΎΠ»Π½ΡΠ΅" ΠΊ ΡΡΠ΅Π½Π΅, ΠΈ ΠΏΡΠΎΠΆΠ΅ΠΊΡΠΎΡΡ (spot) Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠ΅Π½Π΄Π΅ΡΠ° Π½Π° ΡΡΠ΅Π½Π΅. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΏΡΠΎΠΆΠ΅ΠΊΡΠΎΡ ΠΈΠΌΠ΅Π΅Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ TrackTo, Π·Π°ΡΡΠ°Π²Π»ΡΡΡΠ΅Π΅ Π±ΡΡΡ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΠΌ Π½Π° ΡΠ²ΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΡΠΎΠ»Π½ΡΠ΅ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ ΡΠ΅Π½ΡΡ Π²ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌΡΡ Π½Π° ΡΡΠ΅Π½Π΅.
#----------------------------------------------------------
# File camera.py
# Adds one camera and several lights
#----------------------------------------------------------
import bpy, mathutils, math
from mathutils import Vector
from math import pi
def findMidPoint():
# ΠΠ°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Ρ Π²ΡΠ΅Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²
sum = Vector((0,0,0))
n = 0
for ob in bpy.data.objects:
if ob.type not in ['CAMERA', 'LAMP', 'EMPTY']:
sum += ob.location
n += 1
if n == 0:
return sum
else:
return sum/n
def addTrackToConstraint(ob, name, target):
# ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ TrackTo
cns = ob.constraints.new('TRACK_TO')
cns.name = name
cns.target = target
cns.track_axis = 'TRACK_NEGATIVE_Z'
cns.up_axis = 'UP_Y'
cns.owner_space = 'WORLD'
cns.target_space = 'WORLD'
return
def createLamp(name, lamptype, loc):
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΡ
bpy.ops.object.add(
type='LAMP',
location=loc)
ob = bpy.context.object
ob.name = name
lamp = ob.data
lamp.name = 'Lamp'+name
lamp.type = lamptype
return ob
def createLamps(origin, target):
deg2rad = 2*pi/360
sun = createLamp('sun', 'SUN', origin+Vector((0,20,50)))
lamp = sun.data
lamp.type = 'SUN'
addTrackToConstraint(sun, 'TrackMiddle', target)
for ob in bpy.context.scene.objects:
if ob.type == 'MESH':
spot = createLamp(ob.name+'Spot', 'SPOT', ob.location+Vector((0,2,1)))
bpy.ops.transform.resize(value=(0.5,0.5,0.5))
lamp = spot.data
# ΠΠ°ΠΌΠΏΠ°
lamp.type = 'SPOT'
lamp.color = (0.5,0.5,0)
lamp.energy = 0.9
lamp.falloff_type = 'INVERSE_LINEAR'
lamp.distance = 7.5
# Π€ΠΎΡΠΌΠ° Π»ΡΡΠ° ΠΏΡΠΎΠΆΠ΅ΠΊΡΠΎΡΠ°
lamp.spot_size = 30*deg2rad
lamp.spot_blend = 0.3
# Π’Π΅Π½ΠΈ
lamp.shadow_method = 'BUFFER_SHADOW'
lamp.use_shadow_layer = True
lamp.shadow_buffer_type = 'REGULAR'
lamp.shadow_color = (0,0,1)
addTrackToConstraint(spot, 'Track'+ob.name, ob)
return
def createCamera(origin, target):
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈ ΠΊΠ°ΠΌΠ΅ΡΡ
bpy.ops.object.add(
type='CAMERA',
location=origin,
rotation=(pi/2,0,pi))
ob = bpy.context.object
ob.name = 'MyCamOb'
cam = ob.data
cam.name = 'MyCam'
addTrackToConstraint(ob, 'TrackMiddle', target)
# ΠΠ±ΡΠ΅ΠΊΡΠΈΠ²
cam.type = 'PERSP'
cam.lens = 75
cam.lens_unit = 'MILLIMETERS'
cam.shift_x = -0.05
cam.shift_y = 0.1
cam.clip_start = 10.0
cam.clip_end = 250.0
empty = bpy.data.objects.new('DofEmpty', None)
empty.location = origin+Vector((0,10,0))
cam.dof_object = empty
# ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
cam.show_title_safe = True
cam.show_name = True
# ΠΠ΅Π»Π°Π΅ΠΌ Π΅Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΊΠ°ΠΌΠ΅ΡΠΎΠΉ
scn = bpy.context.scene
scn.camera = ob
return ob
def run(origin):
# Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π²ΡΠ΅Ρ ΠΊΠ°ΠΌΠ΅Ρ ΠΈ Π»Π°ΠΌΠΏ
scn = bpy.context.scene
for ob in scn.objects:
if ob.type == 'CAMERA' or ob.type == 'LAMP':
scn.objects.unlink(ob)
# ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΡΡΡΡΠΊΠΈ Π² ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π΅ Π²ΡΠ΅Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²
midpoint = findMidPoint()
bpy.ops.object.add(
type='EMPTY',
location=midpoint),
target = bpy.context.object
target.name = 'Target'
createCamera(origin+Vector((50,90,50)), target)
createLamps(origin, target)
return
if __name__ == "__main__":
run(Vector((0,0,0)))
ΠΠΈΡ, Π²ΠΈΠ΄ ΠΈ ΡΠ΅Π½Π΄Π΅Ρ
ΠΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠ΅Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΠΈΡΠ°. ΠΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π½Π΄Π΅ΡΠΎΠΌ ΠΊΡΠ±Π° ΠΏΠΎ-ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠΎ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΉ ΠΊΠ°ΠΌΠ΅ΡΠΎΠΉ ΠΈ ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΠ΅ΠΌ.
#--------------------------------------------------
# File world.py
#--------------------------------------------------
import bpy
def run():
world = bpy.context.scene.world
# ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ ΠΠΈΡΠ°
world.use_sky_blend = True
world.ambient_color = (0.05, 0, 0)
world.horizon_color = (0, 0, 0.2)
world.zenith_color = (0.04, 0, 0.04)
# ΠΠ²ΡΠ·Π΄Ρ
sset = world.star_settings
sset.use_stars = True
sset.average_separation = 17.8
sset.color_random = 1.0
sset.distance_min = 0.7
sset.size = 10
# ΠΠΊΡΡΠΆΠ°ΡΡΠ΅Π΅ ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΠ΅
wset = world.light_settings
wset.use_environment_light = True
wset.use_ambient_occlusion = True
wset.ao_blend_type = 'MULTIPLY'
wset.ao_factor = 0.8
wset.gather_method = 'APPROXIMATE'
# Π’Π΅ΠΊΡΡΡΡΠ° "ΠΠ±Π»Π°ΠΊΠ°" (Clouds)
tex = bpy.data.textures.new('Clouds', type = 'CLOUDS')
tex.cloud_type = 'GREYSCALE'
tex.noise_type = 'SOFT_NOISE'
tex.noise_basis = 'ORIGINAL_PERLIN'
tex.noise_scale = 0.06
tex.noise_depth = 1
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ΅ΠΊΡΡΡΡΡ ΠΊΠ°ΠΊ Π°ΠΊΡΠΈΠ²Π½ΠΎΠΉ ΡΠ΅ΠΊΡΡΡΡΡ ΠΠΈΡΠ°
world.active_texture = tex
# Retrieve texture slot
wtex = world.texture_slots[world.active_texture_index]
print(wtex, world.active_texture_index)
# ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠ΅ΠΊΡΡΡΡΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΡΠ°
wtex.use_map_blend = False
wtex.use_map_horizon = False
wtex.use_map_zenith_down = False
wtex.use_map_zenith_up = True
wtex.color = (1,1,1)
wtex.texture_coords = 'VIEW'
wtex.zenith_up_factor = 1.0 return
if __name__ == "__main__":
run()
ΠΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠ΅Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠ΅Π½Π΄Π΅ΡΠ°, ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π½Π° ΡΠΊΡΠ°Π½ ΠΏΠΎ-ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΠΊΠ°ΠΌΠ΅ΡΡ Π² 3D-Π²ΠΈΠ΄Π΅. Π ΠΊΠΎΠ½ΡΠ΅ ΡΡΠ°ΡΡΡΠ΅Ρ Π°Π½ΠΈΠΌΠ°ΡΠΈΡ, ΠΊ Π½Π΅ΡΡΠ°ΡΡΡΡ, Π² ΡΡΠ°ΡΠΎΠΌ Π²ΠΈΠ΄Π΅.
#----------------------------------------------------------
# File view.py
# ΠΠ·ΠΌΠ΅Π½ΡΠ΅Ρ Π²ΠΈΠ΄ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠ΅Π½Π΄Π΅ΡΠ°
#----------------------------------------------------------
import bpy
def setRenderSettings():
render = bpy.context.scene.render
render.resolution_x = 720
render.resolution_y = 576
render.resolution_percentage = 100
render.fps = 24
render.use_raytrace = False
render.use_color_management = True
render.use_sss = False
return
def setDefaultCameraView():
for scrn in bpy.data.screens:
if scrn.name == 'Default':
bpy.context.window.screen = scrn
for area in scrn.areas:
if area.type == 'VIEW_3D':
for space in area.spaces:
if space.type == 'VIEW_3D':