改良 試験
最初の 一個は 捨て
import bpy
from mathutils import Vector
zion_x =-10
zion_y = -50
distance_per_frame = 1.0 # 1フレームごとの移動距離(ブレンダー単位)
run_simultaneously = False # True なら同時移動、False なら順次移動
for a in range(11):
# 新しい球体を作成
bpy.ops.mesh.primitive_uv_sphere_add(radius=1)
sphere = bpy.context.object
# 初期位置のキーフレームを設定
sphere.location = Vector((zion_x +a * 10 + 10, zion_y, 0))
sphere.keyframe_insert(data_path='location', frame=a * 10)
# 終了位置のキーフレームを設定
sphere.location = Vector((zion_x +a * 10 + 10, 500, 0))
sphere.keyframe_insert(data_path='location', frame=500)
# 位置のキーフレームを設定
if run_simultaneously:
for i in range(101):
sphere.location = Vector((a * 10 + 10, i * distance_per_frame, 0))
sphere.keyframe_insert(data_path='location', frame=i)
else:
current_frame = a * 10
current_pos = Vector((a * 10 + 10, zion_y, 0))
while current_frame <= 500:
current_pos += Vector((0, distance_per_frame, 0))
sphere.location = current_pos
sphere.keyframe_insert(data_path='location', frame=current_frame)
current_frame += 1
# アニメーションを再生
bpy.context.scene.frame_end = 500
bpy.ops.screen.animation_play()
現在のスクリプトでは、各球体が一定速度で移動するように設定されていますが、各球体が1フレーム毎に同じ距離だけ移動するようにするには、球体の位置をフレームごとに更新するときに、現在の位置から1フレームごとの移動距離を加算することが必要です。
修正後のスクリプトは以下のようになります
この修正後のスクリプトでは、distance_per_frame
変数に1フレームごとの移動距離を設定し、各球体の位置を while
ループを用いてフレームごとに更新しています。また、順次移動する場合、現在のフレームと位置を変数 current_frame
と current_pos
に格納しています。
これにより、各球体が1フレーム毎に同じ距離だけ移動するアニメーションが作成されます。
各球体が1フレーム毎に同じ速度で移動するように
run_simultaneously の値を False に設定する。
位置のキーフレームを設定する際のループの開始値を、球体の番号 a に合わせるように変更する。
修正後のスクリプトは以下のようになります。
import bpy
from mathutils import Vector
zion_y = -50
zion_speed = 0.2 # 1秒あたりの移動距離(ブレンダー単位)
run_simultaneously = False # True なら同時移動、False なら順次移動
for a in range(11):
# 新しい球体を作成
bpy.ops.mesh.primitive_uv_sphere_add(radius=1)
sphere = bpy.context.object
# 初期位置のキーフレームを設定
sphere.location = Vector((a * 10 + 10, zion_y, 0))
sphere.keyframe_insert(data_path='location', frame=a * 10)
# 終了位置のキーフレームを設定
sphere.location = Vector((a * 10 + 10, 500, 0))
sphere.keyframe_insert(data_path='location', frame=500)
# 位置のキーフレームを設定
if run_simultaneously:
for i in range(101):
sphere.location = Vector((a * 10 + 10, i * zion_speed, 0))
sphere.keyframe_insert(data_path='location', frame=i)
else:
for i in range(a * 10, 101):
sphere.location = Vector((a * 10 + 10, (i - a * 10) * zion_speed, 0))
sphere.keyframe_insert(data_path='location', frame=i)
# アニメーションを再生
bpy.context.scene.frame_end = 500
bpy.ops.screen.animation_play()
# import bpy
# from mathutils import Vector
# zion_y = -50
zion_speed = 0.2 # 1秒あたりの移動距離(ブレンダー単位)
run_simultaneously = True # True なら同時移動、False なら順次移動
for a in range(11):
# 新しい球体を作成
bpy.ops.mesh.primitive_uv_sphere_add(radius=1)
sphere = bpy.context.object
# 初期位置のキーフレームを設定
sphere.location = Vector((a * 10 + 10, zion_y, 0))
sphere.keyframe_insert(data_path='location', frame=a * 10)
# 終了位置のキーフレームを設定
sphere.location = Vector((a * 10 + 10, 500, 0))
sphere.keyframe_insert(data_path='location', frame=500)
# 位置のキーフレームを設定
if run_simultaneously:
for i in range(101):
sphere.location = Vector((a * 10 + 10, i * zion_speed, 0))
sphere.keyframe_insert(data_path='location', frame=i)
else:
for i in range(a * 10, 101):
sphere.location = Vector((a * 10 + 10, (i - a * 10) * zion_speed, 0))
sphere.keyframe_insert(data_path='location', frame=i)
# アニメーションを再生
bpy.context.scene.frame_end = 500
bpy.ops.screen.animation_play()
# 初期位置のキーフレームを設定
sphere.location = Vector((a * 10 + 10, zion_y, 0))
# 終了位置のキーフレームを設定
sphere.location = Vector((a * 10 + 10, 500, 0))
の 直線距離を zion_length を計算し
zion_standard = 500
zion_slow = zion_standard / zion_length にして
球体毎の速度に それぞれの zion_slow を掛けて
速度を調整して