円柱 長さ2を
赤 ミドリ 青で
正三角形の位置だから 半径 √3のトーラス円周 用意
https://chatgpt111blender2023.blogspot.com/2023/04/blog-post_50.html
import bpy
# コレクションを作成
collection_name = "土台"
if collection_name not in bpy.data.collections:
zionad_collection = bpy.data.collections.new(collection_name)
bpy.context.scene.collection.children.link(zionad_collection)
else:
zionad_collection = bpy.data.collections[collection_name]
# 半径 √3の トーラス
import bpy
from math import radians
# トーラスを作成する
bpy.ops.mesh.primitive_torus_add(major_radius=3**(0.5), minor_radius=0.05)
# 回転させる軸を選択する
zion_xyz = 'zana'
if zion_xyz == 'xana':
# 軸を中心に90度回転させる
bpy.context.object.rotation_euler[0] = radians(0)
bpy.context.object.rotation_euler[1] = radians(90)
bpy.context.object.rotation_euler[2] = radians(0)
# X軸方向に伸ばす
bpy.context.object.scale[0] = 1
bpy.context.object.scale[1] = 1
bpy.context.object.scale[2] = 1
elif zion_xyz == 'yana':
# 軸を中心に90度回転させる
bpy.context.object.rotation_euler[0] = radians(90)
bpy.context.object.rotation_euler[1] = radians(0)
bpy.context.object.rotation_euler[2] = radians(0)
# Y軸方向に伸ばす
bpy.context.object.scale[0] = 3
bpy.context.object.scale[1] = 3
bpy.context.object.scale[2] = 3
elif zion_xyz == 'zana':
# Z軸を中心に90度回転させる
bpy.context.object.rotation_euler[0] = radians(0)
bpy.context.object.rotation_euler[1] = radians(0)
bpy.context.object.rotation_euler[2] = radians(0)
# Z軸方向に伸ばす
bpy.context.object.scale[0] = 1
bpy.context.object.scale[1] = 1
bpy.context.object.scale[2] = 1
else:
print('Invalid rotation axis selected.')
# トーラスを選択する
bpy.context.view_layer.objects.active = bpy.context.selected_objects[0]
# オブジェクト名
bpy.context.object.name = "torus root3 radius"
# 半径 2の トーラス
import bpy
from math import radians
# トーラスを作成する
bpy.ops.mesh.primitive_torus_add(major_radius= 2.0, minor_radius=0.05)
# 回転させる軸を選択する
zion_xyz = 'zana'
if zion_xyz == 'xana':
# 軸を中心に90度回転させる
bpy.context.object.rotation_euler[0] = radians(0)
bpy.context.object.rotation_euler[1] = radians(90)
bpy.context.object.rotation_euler[2] = radians(0)
# X軸方向に伸ばす
bpy.context.object.scale[0] = 1
bpy.context.object.scale[1] = 1
bpy.context.object.scale[2] = 1
elif zion_xyz == 'yana':
# 軸を中心に90度回転させる
bpy.context.object.rotation_euler[0] = radians(90)
bpy.context.object.rotation_euler[1] = radians(0)
bpy.context.object.rotation_euler[2] = radians(0)
# Y軸方向に伸ばす
bpy.context.object.scale[0] = 3
bpy.context.object.scale[1] = 3
bpy.context.object.scale[2] = 3
elif zion_xyz == 'zana':
# Z軸を中心に90度回転させる
bpy.context.object.rotation_euler[0] = radians(0)
bpy.context.object.rotation_euler[1] = radians(0)
bpy.context.object.rotation_euler[2] = radians(0)
# Z軸方向に伸ばす
bpy.context.object.scale[0] = 1
bpy.context.object.scale[1] = 1
bpy.context.object.scale[2] = 1
else:
print('Invalid rotation axis selected.')
# トーラスを選択する
bpy.context.view_layer.objects.active = bpy.context.selected_objects[0]
#トーラスの位置を変更する
bpy.context.object.location = (0, -3**(0.5), 0)
# オブジェクト名
bpy.context.object.name = "torus 2 radius"
import bpy
# コレクションを作成
collection_name = "電車列車"
if collection_name not in bpy.data.collections:
zionad_collection = bpy.data.collections.new(collection_name)
bpy.context.scene.collection.children.link(zionad_collection)
else:
zionad_collection = bpy.data.collections[collection_name]
#展望車の先頭 カメラ追跡
import bpy
import math
import mathutils
# 円柱を作成
bpy.ops.mesh.primitive_cylinder_add(radius=0.2, depth=0.1)
# 作成した円柱を選択
cylinder = bpy.context.active_object
# 円柱を移動
start_location = mathutils.Vector((-1, 0, 0))
cylinder.location = start_location
# y軸に90度回転
cylinder.rotation_euler[1] = 1.5708
# オブジェクト名を変更
cylinder.name = "展望車の先頭"
# アニメーション設定
scene = bpy.context.scene
fps = scene.render.fps
# キーフレームの設定
frame_start = 0
frame_end = 600
cylinder.keyframe_insert(data_path="location", frame=frame_start)
cylinder.keyframe_insert(data_path="location", frame=frame_end)
# 速度調整
speed = 0.3 # 1秒あたりの移動距離
frame_count = frame_end - frame_start + 1
for i, fc in enumerate(range(frame_start, frame_end + 1)):
# 現在のフレーム数から、開始位置を引いた値を1秒あたりの移動距離で乗じる
location = start_location + mathutils.Vector((i / fps * speed, 0, 0))
cylinder.location = location
cylinder.keyframe_insert(data_path="location", frame=fc)
# カメラ設定
zion_camera_name = "展望車 先頭Camera"
bpy.ops.object.camera_add(location=(0, -math.sqrt(3), 0))
zion_camera = bpy.context.active_object
zion_camera.name = zion_camera_name
zion_camera.constraints.new('TRACK_TO')
zion_camera.constraints['Track To'].target = cylinder
zion_camera.constraints['Track To'].track_axis = 'TRACK_NEGATIVE_Z'
zion_camera.constraints['Track To'].up_axis = 'UP_Y'
# 展望車をカメラに追従
for cam in [zion_camera]:
follow = cam.constraints.new('FOLLOW_PATH')
follow.target = cylinder
follow.use_fixed_location = True
follow.use_curve_follow = True
follow.forward_axis = 'TRACK_NEGATIVE_Z'
follow.up_axis = 'UP_Y'
#展望車
import bpy
import math
import mathutils
# 円柱を作成
bpy.ops.mesh.primitive_cylinder_add(radius=0.2, depth=2.0)
# 作成した円柱を選択
cylinder = bpy.context.active_object
# 円柱を移動
start_location = mathutils.Vector((-2, 0, 0))
cylinder.location = start_location
# y軸に90度回転
cylinder.rotation_euler[1] = 1.5708
# オブジェクト名を変更
cylinder.name = "展望車"
# アニメーション設定
scene = bpy.context.scene
fps = scene.render.fps
# キーフレームの設定
frame_start = 0
frame_end = 600
cylinder.keyframe_insert(data_path="location", frame=frame_start)
cylinder.keyframe_insert(data_path="location", frame=frame_end)
# 速度調整
speed = 0.3 # 1秒あたりの移動距離
frame_count = frame_end - frame_start + 1
for i, fc in enumerate(range(frame_start, frame_end + 1)):
# 現在のフレーム数から、開始位置を引いた値を1秒あたりの移動距離で乗じる
location = start_location + mathutils.Vector((i / fps * speed, 0, 0))
cylinder.location = location
cylinder.keyframe_insert(data_path="location", frame=fc)
#先頭車の先頭 カメラ追跡
import bpy
import math
import mathutils
# 円柱を作成
bpy.ops.mesh.primitive_cylinder_add(radius=0.2, depth=0.1)
# 作成した円柱を選択
cylinder = bpy.context.active_object
# 円柱を移動
start_location = mathutils.Vector((1, 0, 0))
cylinder.location = start_location
# y軸に90度回転
cylinder.rotation_euler[1] = 1.5708
# オブジェクト名を変更
cylinder.name = "先頭車の尻尾"
# アニメーション設定
scene = bpy.context.scene
fps = scene.render.fps
# キーフレームの設定
frame_start = 0
frame_end = 600
cylinder.keyframe_insert(data_path="location", frame=frame_start)
cylinder.keyframe_insert(data_path="location", frame=frame_end)
# 速度調整
speed = 0.3 # 1秒あたりの移動距離
frame_count = frame_end - frame_start + 1
for i, fc in enumerate(range(frame_start, frame_end + 1)):
# 現在のフレーム数から、開始位置を引いた値を1秒あたりの移動距離で乗じる
location = start_location + mathutils.Vector((i / fps * speed, 0, 0))
cylinder.location = location
cylinder.keyframe_insert(data_path="location", frame=fc)
# カメラ設定
zion_camera_name = "先頭車 尻尾 Camera"
bpy.ops.object.camera_add(location=(0, -math.sqrt(3), 0))
zion_camera = bpy.context.active_object
zion_camera.name = zion_camera_name
zion_camera.constraints.new('TRACK_TO')
zion_camera.constraints['Track To'].target = cylinder
zion_camera.constraints['Track To'].track_axis = 'TRACK_NEGATIVE_Z'
zion_camera.constraints['Track To'].up_axis = 'UP_Y'
# 展望車をカメラに追従
for cam in [zion_camera]:
follow = cam.constraints.new('FOLLOW_PATH')
follow.target = cylinder
follow.use_fixed_location = True
follow.use_curve_follow = True
follow.forward_axis = 'TRACK_NEGATIVE_Z'
follow.up_axis = 'UP_Y'
#先頭車
import bpy
import math
import mathutils
# 円柱を作成
bpy.ops.mesh.primitive_cylinder_add(radius=0.2, depth=2.0)
# 作成した円柱を選択
cylinder = bpy.context.active_object
# 円柱を移動
start_location = mathutils.Vector((2, 0, 0))
cylinder.location = start_location
# y軸に90度回転
cylinder.rotation_euler[1] = 1.5708
# オブジェクト名を変更
cylinder.name = "先頭車"
# アニメーション設定
scene = bpy.context.scene
fps = scene.render.fps
# キーフレームの設定
frame_start = 0
frame_end = 600
cylinder.keyframe_insert(data_path="location", frame=frame_start)
cylinder.keyframe_insert(data_path="location", frame=frame_end)
# 速度調整
speed = 0.3 # 1秒あたりの移動距離
frame_count = frame_end - frame_start + 1
for i, fc in enumerate(range(frame_start, frame_end + 1)):
# 現在のフレーム数から、開始位置を引いた値を1秒あたりの移動距離で乗じる
location = start_location + mathutils.Vector((i / fps * speed, 0, 0))
cylinder.location = location
cylinder.keyframe_insert(data_path="location", frame=fc)
#客車
import bpy
import math
import mathutils
# 円柱を作成
bpy.ops.mesh.primitive_cylinder_add(radius=0.2, depth=2.0)
# 作成した円柱を選択
cylinder = bpy.context.active_object
# 円柱を移動
start_location = mathutils.Vector((0, 0, 0))
cylinder.location = start_location
# y軸に90度回転
cylinder.rotation_euler[1] = 1.5708
# オブジェクト名を変更
cylinder.name = "客車"
# アニメーション設定
scene = bpy.context.scene
fps = scene.render.fps
# キーフレームの設定
frame_start = 0
frame_end = 600
cylinder.keyframe_insert(data_path="location", frame=frame_start)
cylinder.keyframe_insert(data_path="location", frame=frame_end)
# 速度調整
speed = 0.3 # 1秒あたりの移動距離
frame_count = frame_end - frame_start + 1
for i, fc in enumerate(range(frame_start, frame_end + 1)):
# 現在のフレーム数から、開始位置を引いた値を1秒あたりの移動距離で乗じる
location = start_location + mathutils.Vector((i / fps * speed, 0, 0))
cylinder.location = location
cylinder.keyframe_insert(data_path="location", frame=fc)