はい、zion_zousoku_xを1.0以外の値にすることで、x軸方向の移動速度を調整できます。zion_zousoku_xが1.0より大きければ、x軸方向の移動速度が加速し、1.0より小さければ減速します。例えば、zion_zousoku_x = 2.0とすると、x軸方向の移動速度が2倍になります。
import bpy
import math
import random
from mathutils import Vector
# 速度を指定する
zion_speed = 1.0
zion_zousoku_x = 2.0 # x軸方向の速度を倍率で調整
# 目標位置を指定する
zion_target = Vector((0, -60, 0))
# 平行移動するかどうかを指定する
parallel = False
# 平行移動量を指定する
parallel_distance = Vector((300, 300, 300)) # ここを変更する
# 球体を作成する関数
def create_sphere(location, radius):
bpy.ops.mesh.primitive_uv_sphere_add(location=location, radius=radius, enter_editmode=False)
# アニメーションを設定する関数
def set_animation(obj, start_frame, end_frame, target_location, speed):
distance = (target_location - obj.location).length
duration = distance / speed
for frame in range(start_frame, end_frame+1):
t = (frame - start_frame) / duration
obj.location = obj.location.lerp(target_location, t)
obj.keyframe_insert(data_path="location", frame=frame)
# 分布想定 球体を作成する
spheres = []
for i in range(100):
phi = random.uniform(0, math.pi)
theta = random.uniform(0, 2*math.pi)
radius = 0.0001
x = radius * math.sin(phi) * math.cos(theta)
y = radius * math.sin(phi) * math.sin(theta)
z = radius * math.cos(phi)
location = Vector((x, y, 0))
create_sphere(location, 1.0)
obj = bpy.context.active_object
obj.name = "分布拡大sphere"
spheres.append(obj)
# アニメーションを設定する
for i, sphere in enumerate(spheres):
start_frame = 1
end_frame = 600
location = sphere.location
if parallel:
target_location = location + parallel_distance
else:
# 表面に沿って動くように設定する
normal = location.normalized()
target_location = location + normal * 60 # 半径30の球体表面に沿って動く
distance = (target_location - location).length
# x軸方向の速度を加算する
speed_x = distance / (zion_speed + zion_zousoku_x)
speed = zion_speed / distance + zion_zousoku_x / speed_x
set_animation(sphere, start_frame, end_frame, target_location, speed)
最終地点も 動かしたが 倍率で動かしたので 無効
import bpy
import math
import random
from mathutils import Vector
# 速度を指定する
zion_speed = 1.0
zion_zousoku_x = 1.1
# 目標位置を指定する
zion_target = Vector((0, -60, 0))
# 平行移動するかどうかを指定する
parallel = False
# 平行移動量を指定する
parallel_distance = Vector((300, 300, 300)) # ここを変更する
# 球体を作成する関数
def create_sphere(location, radius):
bpy.ops.mesh.primitive_uv_sphere_add(location=location, radius=radius, enter_editmode=False)
# アニメーションを設定する関数
def set_animation(obj, start_frame, end_frame, target_location, speed):
distance = (target_location - obj.location).length
duration = distance / speed
for frame in range(start_frame, end_frame+1):
t = (frame - start_frame) / duration
obj.location = obj.location.lerp(target_location, t)
obj.keyframe_insert(data_path="location", frame=frame)
# 分布想定 球体を作成する
spheres = []
for i in range(100):
phi = random.uniform(0, math.pi)
theta = random.uniform(0, 2*math.pi)
radius = 0.0001
x = radius * math.sin(phi) * math.cos(theta)
y = radius * math.sin(phi) * math.sin(theta)
z = radius * math.cos(phi)
location = Vector((x, y, 0))
create_sphere(location, 1.0)
obj = bpy.context.active_object
obj.name = "分布拡大sphere"
spheres.append(obj)
# アニメーションを設定する
for i, sphere in enumerate(spheres):
start_frame = 1
end_frame = 600
location = sphere.location
if parallel:
target_location = location + parallel_distance
else:
# 表面に沿って動くように設定する
normal = location.normalized()
target_location = location + normal * 60 # 半径30の球体表面に沿って動く
# x軸方向の速度を調整する
if target_location.x > location.x:
target_location.x *= zion_zousoku_x
else:
target_location.x /= zion_zousoku_x
distance = (target_location - location).length
speed = zion_speed / distance
set_animation(sphere, start_frame, end_frame, target_location, speed)
# 最終位置のx成分も調整する
if not parallel:
for sphere in spheres:
location = sphere.location
if location.x > 0:
sphere.location.x *= zion_zousoku_x
else:
sphere.location.x /= zion_zousoku_x
bbb