2023年8月9日水曜日

20230810  Z=0 トーラス2つで 90度角 演出 √2長さの電車








import bpy

import math


# 初期設定

torus_major_radius = 1.0  # トーラスのメジャー半径

torus_minor_radius = 0.03  # トーラスのマイナー半径

sphere_radius = 0.07  # 球体の半径

animation_duration = 20  # アニメーションの時間(秒)

frame_rate = bpy.context.scene.render.fps

clockwise = True  # 時計回り: False, 反時計回り: True


# トーラスを作成

bpy.ops.mesh.primitive_torus_add(align='WORLD', major_radius=torus_major_radius, minor_radius=torus_minor_radius, location=(0, 0, 0))  # 描画開始位置

torus1 = bpy.context.active_object


# 球体を作成

bpy.ops.mesh.primitive_uv_sphere_add(radius=sphere_radius, location=(-1, 0, 0))  # 描画開始位置

sphere1 = bpy.context.active_object


# 球体をトーラスにリンク設定

sphere1.parent = torus1


# ゴール時間を設定

goal_frame = animation_duration * frame_rate


# アニメーションを設定

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

    bpy.context.scene.frame_set(frame)


    # トーラスを回転させる

    angle = 2 * math.pi * (frame / (animation_duration * frame_rate))

    if clockwise:

        angle = -angle

    torus1.rotation_euler.z = angle

    torus1.keyframe_insert(data_path="rotation_euler", frame=frame)


    # 球体もアニメーション

    sphere1.rotation_euler.z = angle

    sphere1.keyframe_insert(data_path="rotation_euler", frame=frame)


# 2つ目のトーラスを作成

bpy.ops.mesh.primitive_torus_add(align='WORLD', major_radius=torus_major_radius, minor_radius=torus_minor_radius, location=(0, 0, 0))  # 描画開始位置

torus2 = bpy.context.active_object


# 2つ目の球体を作成

bpy.ops.mesh.primitive_uv_sphere_add(radius=sphere_radius, location=(0, 1, 0))  # 描画開始位置

sphere2 = bpy.context.active_object


# 2つ目の球体をトーラスにリンク設定

sphere2.parent = torus2


# アニメーションを設定

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

    bpy.context.scene.frame_set(frame)


    # 2つ目のトーラスを回転させる

    angle = 2 * math.pi * (frame / (animation_duration * frame_rate))

    if clockwise:

        angle = -angle

    torus2.rotation_euler.z = angle

    torus2.keyframe_insert(data_path="rotation_euler", frame=frame)


    # 2つ目の球体もアニメーション

    sphere2.rotation_euler.z = angle

    sphere2.keyframe_insert(data_path="rotation_euler", frame=frame)


# アウトライナで全てのオブジェクトを選択解除

bpy.ops.object.select_all(action='DESELECT')


# endを530フレームに設定

bpy.context.scene.frame_end = 530





2つの球体の間に 等間隔で 9つの球体を

球体半径 0.04 で 作って

ただし 9つの真ん中の球体だけ 0.06


1番トーラスの2つの球体の間

2番トーラスの2つの球体の間に 作って


トーラスの回転に連動させる





以下 ChatGPT との対話 修正記録 と メモ・ノート


ああああああああああああああああああああああああああああああああああああああああああああ