# 1個の球体の 軌道回転 成功
import bpy
from mathutils import Vector
import math
radius = 60 # 軌道半径
speed = 1.0 # 回転速度
distance_per_frame = 0.2 # 移動する距離
current_angle = 0.0 # 現在の角度
# 球体を作成する
bpy.ops.mesh.primitive_uv_sphere_add(radius=1, location=(radius, 0, 0))
sphere = bpy.context.active_object
sphere.name = "Sphere"
# 毎フレーム呼び出される関数
def animate_spheres(scene):
global current_angle
global sphere
# 球体を回転する
sphere.rotation_euler[2] += speed
# 次の位置を計算する
current_angle += distance_per_frame / radius
if current_angle > 2 * math.pi:
current_angle -= 2 * math.pi
x = radius * math.cos(current_angle)
y = radius * math.sin(current_angle)
z = 0
location = Vector((x, y, z))
# 球体の位置を更新する
sphere.location = location
# フレーム更新のコールバック関数を登録する
bpy.app.handlers.frame_change_pre.append(animate_spheres)
複数だと
描画が 飛びすぎる
import bpy
import math
from mathutils import Vector
# 回転速度を設定する
zion_speed_round = 1.0
# 半径を設定する
radius = 60
# 移動する距離を指定する
distance_per_frame = 0.2
# 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)
# フレーム更新のコールバック関数を定義する
def animate_spheres(scene):
# 現在のフレーム数から球体の角度を計算する
angle = (scene.frame_current * zion_speed_round) % (2 * math.pi)
for i, sphere in enumerate(spheres):
# 次のフレームでの角度を計算する
next_angle = ((scene.frame_current + 1) * zion_speed_round) % (2 * math.pi)
# 次のフレームでの位置を計算する
x = radius * math.cos(next_angle)
y = radius * math.sin(next_angle)
z = 0
location = Vector((x, y, z))
# 球体の位置を更新する
sphere.location = location
# 球体を回転する
angle = next_angle - i * 2 * math.pi / 16
sphere.rotation_euler[2] += angle
# フレーム更新のコールバック関数を登録する
bpy.app.handlers.frame_change_pre.append(animate_spheres)