指定された座標に向けて等速で移動させる
Blender Pythonスクリプトを作って
ad jazzion
x**2 +y**2 =30 に 等間隔で16個の半径1の球体を作り
0,ー30,0へ 移動させる
移動中の速度は 同じにする
0,ー30、0から
半径1の球体 16個を
-30,0,0から 30,0,0の 等間隔の位置に移動させる
移動中の速度は 同じに設定
blender python スクリプト書いて
import bpy
import math
# オブジェクトを作成する関数
def create_sphere(location, radius):
bpy.ops.mesh.primitive_uv_sphere_add(location=location, radius=radius)
# アニメーションを設定する関数
def set_animation(obj, start_frame, end_frame, target_location, speed):
distance = math.sqrt((target_location[0] - obj.location[0]) ** 2 + (target_location[1] - obj.location[1]) ** 2 + (target_location[2] - obj.location[2]) ** 2)
for frame in range(start_frame, end_frame + 1):
obj.location = obj.location.lerp(target_location, speed / distance)
obj.keyframe_insert(data_path="location", frame=frame)
# 2点間の距離を計算する
start_location = (10, 10, 10)
end_location = (-10, -10, -10)
distance = math.sqrt((end_location[0] - start_location[0]) ** 2 + (end_location[1] - start_location[1]) ** 2 + (end_location[2] - start_location[2]) ** 2)
# 16個の球体を作成する
for i in range(16):
angle = 2 * i * math.pi / 16
x = 10 * math.cos(angle)
y = 10 * math.sin(angle)
z = 0
location = (x, y, z)
radius = 1
create_sphere(location, radius)
obj = bpy.context.active_object
set_animation(obj, 1, 500, end_location, distance / 500)
import bpy
import math
# オブジェクトを作成する関数
def create_sphere(location, radius):
bpy.ops.mesh.primitive_uv_sphere_add(location=location, radius=radius)
# アニメーションを設定する関数
def set_animation(obj, start_frame, end_frame, target_location speed_factor=0.1 ):
distance = math.sqrt((target_location[0] - obj.location[0]) ** 2 + (target_location[1] - obj.location[1]) ** 2 + (target_location[2] - obj.location[2]) ** 2)
speed = distance / (end_frame - start_frame)
for frame in range(start_frame, end_frame + 1):
obj.location = obj.location.lerp(target_location, speed)
obj.keyframe_insert(data_path="location", frame=frame)
# 16個の球体を作成する
for i in range(16):
angle = 2 * i * math.pi / 16
x = 30 * math.cos(angle)
y = 30 * math.sin(angle)
z = 0
location = (x, y, z)
radius = 1
create_sphere(location, radius)
obj = bpy.context.active_object
set_animation(obj, 1, 500, (0, -30, 0))
speed_factor
という引数を追加し、デフォルト値を1に設定します。この引数は速度の倍率を表します。元の速度の1/10にしたい場合は、set_animation
関数を呼び出す際にspeed_factor
に0.1を渡します。speed_factor
という引数を追加し、デフォルト値を1に設定します。この引数は速度の倍率を表します。元の速度の1/10にしたい場合は、set_animation
関数を呼び出す際にspeed_factor
に0.1を渡します。# アニメーションを設定する関数
def set_animation(obj, start_frame, end_frame, target_location, speed_factor=1):
distance = math.sqrt((target_location[0] - obj.location[0]) ** 2 + (target_location[1] - obj.location[1]) ** 2 + (target_location[2] - obj.location[2]) ** 2)
speed = distance / (end_frame - start_frame) * speed_factor
for frame in range(start_frame, end_frame + 1):
obj.location = obj.location.lerp(target_location, speed)
obj.keyframe_insert(data_path="location", frame=frame)
import bpy
import random
# 円錐の半径と高さを設定
radius = 0.5
height = 1.0
for i in range(50):
# 円錐の初期位置と移動先の位置をランダムに設定
x = random.uniform(-30, 30)
loc_a_start = (x, 0, 0)
loc_a_end = (0, 30, 0)
# 円錐Aを作成し、初期位置を設定する
bpy.ops.mesh.primitive_cone_add(radius1=radius, radius2=0, depth=height, location=loc_a_start)
obj_a = bpy.context.object
# アニメーションのフレーム設定を行う
start_frame = 1 # アニメーションの最初のフレーム
distance = (((0-0)**2 + (x-0)**2 + (30-0)**2)**0.5) /30
end_frame_a = int(distance * 20 * bpy.context.scene.render.fps) # 円錐Aの移動が終わるフレーム
bpy.context.scene.frame_start = start_frame # アニメーションの開始フレームを設定
bpy.context.scene.frame_end = end_frame_a # アニメーションの終了フレームを設定
# キーフレームを設定する
obj_a.location = loc_a_start # 円錐Aの開始位置を設定
obj_a.keyframe_insert(data_path="location", frame=start_frame) # 開始フレームでキーフレームを設定
obj_a.location = loc_a_end # 円錐Aの終了位置を設定
obj_a.keyframe_insert(data_path="location", frame=end_frame_a) # 終了フレームでキーフレームを設定
# アニメーション再生
bpy.ops.screen.animation_play() # アニメーションを再生
bbb