2023年4月4日火曜日

円周から 同じ速度で進む  ラストフレームで 停止も可能

 


https://ia2023sha.blogspot.com/2023/03/blog-post_24.html


 フレーム毎の球体移動距離を すべての球体で 同じにしたい 移動終了地点に同時刻に 到着しないことになる スクリプト 全体 作成



この修正により、どの球体も1フレームで移動する距離だけが同じになります。distance_per_frameの値を変更することで、1フレームで移動する距離を調整することができます。










このスクリプトでは、移動距離をフレームごとに均等に設定しています。すべての球体が同じ速度で移動するため、すべての球体は同時に到着しないことになります。




import bpy

import math

from mathutils import Vector


# 目標位置を指定する

target_location = Vector((0, 30, 0))


# フレーム数を指定する

last_frame = 1500


# 移動する距離を指定する

distance_per_frame = 0.2


# 16個の球体を作成する

spheres = []

for i in range(16):

    angle = 2 * i * 3.14159 / 16

    x = 30 * math.cos(angle)

    y = 30 * math.sin(angle)

    z = 0

    location = Vector((x, y, z))

    radius = 1

    bpy.ops.mesh.primitive_uv_sphere_add(location=location, radius=radius)

    obj = bpy.context.active_object

    spheres.append(obj)


# アニメーションを設定する

for i, sphere in enumerate(spheres):

    start_location = sphere.location

    direction = (target_location - start_location).normalized()

    for frame in range(1, last_frame + 1):

        sphere.location += distance_per_frame * direction

        sphere.keyframe_insert(data_path="location", frame=frame)







import bpy

import math

from mathutils import Vector


# 目標位置を指定する

target_location = Vector((0, 30, 0))


# フレーム数を指定する

last_frame = 150


# 移動する距離を指定する

distance_per_frame = 0.2


# 16個の球体を作成する

spheres = []

for i in range(16):

    angle = 2 * i * 3.14159 / 16

    x = 30 * math.cos(angle)

    y = 30 * math.sin(angle)

    z = 0

    location = Vector((x, y, z))

    radius = 1

    bpy.ops.mesh.primitive_uv_sphere_add(location=location, radius=radius)

    obj = bpy.context.active_object

    spheres.append(obj)


# アニメーションを設定する

for i, sphere in enumerate(spheres):

    start_location = sphere.location

    direction = (target_location - start_location).normalized()

    for frame in range(1, last_frame + 1):

        sphere.location += distance_per_frame * direction

        sphere.keyframe_insert(data_path="location", frame=frame)









import bpy

import math

from mathutils import Vector



# 目標位置を指定する

zion_target = Vector((0, 30, 0))


# ラストフレームを指定する

zion_last_frame = 500


# 移動する距離を指定する

distance_per_frame = 0.01


# オブジェクトを作成する関数

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, distance_per_frame):

    distance = (target_location - obj.location).length

    frames = int(distance / distance_per_frame) + 1

    for frame in range(frames):

        t = frame / (frames - 1)

        obj.location = obj.location.lerp(target_location, t)

        obj.keyframe_insert(data_path="location", frame=start_frame+frame)



# 16個の球体を作成する

spheres = []

for i in range(16):

    angle = 2 * i * math.pi / 16

    x = 30 * math.cos(angle)

    y = 30 * math.sin(angle)

    z = 0

    location = Vector((x, y, z))

    radius = 1

    create_sphere(location, radius)

    obj = bpy.context.active_object

    spheres.append(obj)



# アニメーションを設定する

for i, sphere in enumerate(spheres):

    start_frame = 1

    end_frame = zion_last_frame

    set_animation(sphere, start_frame, end_frame, zion_target, distance_per_frame)


改良中 y=-30 中心 円周への球体36個

できた y= -30 中心で z=0平面移動  import bpy import math zion_collection_name = "線路レール 観察者" # コレクションを作成する col = bpy.data.collections.new(zio...