import bpy
import math
from mathutils import Vector
zion_speed_round = 0.05 # 回転速度を設定する
radius = 60 # 半径を設定する
# 16個の球体を作成する
spheres = []
for i in range(16):
angle = 2 * i * math.pi / 16
x = radius * math.cos(angle)
y = radius * math.sin(angle)
z = -60
location = Vector((x, y, z))
sphere_radius = 1
bpy.ops.mesh.primitive_uv_sphere_add(location=location, radius=sphere_radius)
obj = bpy.context.active_object
obj.name = "Sphere_" + str(i) # オブジェクトに名前を付ける
spheres.append(obj)
# 時間を表すフレーム数の初期値を設定する
frame_num = 0
# 毎フレーム呼び出される関数
def animate_spheres(scene):
global frame_num
for i, sphere in enumerate(spheres):
# 現在のフレーム数から球体の角度を計算する
angle = 2 * i * math.pi / 16 + frame_num * zion_speed_round
x = radius * math.cos(angle)
y = radius * math.sin(angle)
distance_per_frame = 0.05 / math.sqrt(2) # 1フレームでの移動距離を設定する
z = distance_per_frame * frame_num
location = Vector((x, y, z))
# 球体の位置を更新する
sphere.location = location
# 球体を回転する
sphere.rotation_euler[2] += zion_speed_round
# フレーム数を1増やす
frame_num += 1
# フレーム更新のコールバック関数を登録する
bpy.app.handlers.frame_change_pre.append(animate_spheres)
回転速度での1フレームでの移動距離を rotation_distance_per_frame、上昇速度での1フレーム移動距離を rise_distance_per_frame とすると、以下のように式を立てることができます。
scss
Copy code
(rotation_distance_per_frame ** 2 + rise_distance_per_frame ** 2) ** 0.5 = 0.05
この式を変形すると、
scss
Copy code
(rotation_distance_per_frame ** 2 + rise_distance_per_frame ** 2) = 0.05 ** 2
(rotation_distance_per_frame ** 2) + (rise_distance_per_frame ** 2) = 0.0025
となります。ここで、回転速度を zion_speed_round、上昇速度を rise_speed とすると、以下のように距離を求めることができます。
scss
Copy code
rotation_distance_per_frame = zion_speed_round * radius
rise_distance_per_frame = rise_speed
(distance_per_frame ** 2) = (rotation_distance_per_frame ** 2) + (rise_distance_per_frame ** 2)
(distance_per_frame ** 2) = (zion_speed_round ** 2) * (radius ** 2) + (rise_speed ** 2)
(distance_per_frame ** 2) - (zion_speed_round ** 2) * (radius ** 2) = (rise_speed ** 2)
rise_speed = (distance_per_frame ** 2 - (zion_speed_round ** 2) * (radius ** 2)) ** 0.5
これらの式を用いて、スクリプトを書き直すことができます。以下に、書き直したスクリプトを示します。
makefile
Copy co
回転速度での1フレームでの移動距離を rotation_distance_per_frame
、上昇速度での1フレーム移動距離を rise_distance_per_frame
とすると、以下のように式を立てることができます。
scss(rotation_distance_per_frame ** 2 + rise_distance_per_frame ** 2) ** 0.5 = 0.05
この式を変形すると、
scss(rotation_distance_per_frame ** 2 + rise_distance_per_frame ** 2) = 0.05 ** 2
(rotation_distance_per_frame ** 2) + (rise_distance_per_frame ** 2) = 0.0025
となります。ここで、回転速度を zion_speed_round
、上昇速度を rise_speed
とすると、以下のように距離を求めることができます。
scssrotation_distance_per_frame = zion_speed_round * radius
rise_distance_per_frame = rise_speed
(distance_per_frame ** 2) = (rotation_distance_per_frame ** 2) + (rise_distance_per_frame ** 2)
(distance_per_frame ** 2) = (zion_speed_round ** 2) * (radius ** 2) + (rise_speed ** 2)
(distance_per_frame ** 2) - (zion_speed_round ** 2) * (radius ** 2) = (rise_speed ** 2)
rise_speed = (distance_per_frame ** 2 - (zion_speed_round ** 2) * (radius ** 2)) ** 0.5
これらの式を用いて、スクリプトを書き直すことができます。以下に、書き直したスクリプトを示します。
makefile