import bpy
import math
import mathutils
# 円錐の高さと底面半径
height = 300
radius = 300
# 円錐を作成するための頂点と面のリスト
verts = []
faces = []
# 円錐の頂点を作成する
num_verts = 32
angle_step = 2 * math.pi / num_verts
for i in range(num_verts):
x = radius * math.cos(angle_step * i)
y = radius * math.sin(angle_step * i)
z = 0
verts.append(mathutils.Vector((x, y, z)))
verts.append(mathutils.Vector((0, 0, height))) # 円錐の先端の頂点を追加
# 円錐の面を作成する
num_faces = num_verts
for i in range(num_faces):
face = [i, (i + 1) % num_verts, num_verts]
faces.append(face)
# メッシュオブジェクトを作成する
mesh = bpy.data.meshes.new('cone_mesh')
mesh.from_pydata(verts, [], faces)
# オブジェクトを作成して、メッシュを割り当てる
obj = bpy.data.objects.new('cone_object', mesh)
bpy.context.scene.collection.objects.link(obj)
# 3Dビューポートを更新する
bpy.context.view_layer.update()
0,0,0 から 0,0,300 で 半径0,5の円筒書いて
import bpy
import mathutils
# 円筒の半径
radius = 2
# 円筒の高さ
height = 300
# 円筒の作成
bpy.ops.mesh.primitive_cylinder_add(radius=radius, depth=height)
# オブジェクトを取得
obj = bpy.context.object
# 円筒の位置を設定
obj.location = mathutils.Vector((0, 0, height / 2))
# 円筒を選択状態にする
obj.select_set(True)
# 円筒のスケールを設定
bpy.ops.transform.resize(value=(1, 1, height / (2 * radius)))
# 3Dカーソルの位置を設定
bpy.context.scene.cursor.location = mathutils.Vector((0, 0, height / 2))
# 3Dカーソルを円筒の中心に移動
bpy.ops.object.origin_set(type='ORIGIN_CURSOR')
# 円筒の選択状態を解除
obj.select_set(False)
import bpy
import math
import mathutils
# 円錐の高さと底面半径
height = 300
radius = 300
# 円錐を作成するための頂点と面のリスト
verts = []
faces = []
# 円錐の頂点を作成する
num_verts = 32
angle_step = 2 * math.pi / num_verts
for i in range(num_verts):
x = radius * math.cos(angle_step * i)
y = radius * math.sin(angle_step * i)
z = 0
verts.append(mathutils.Vector((x, y, z)))
verts.append(mathutils.Vector((0, 0, height))) # 円錐の先端の頂点を追加
# 円錐の面を作成する
num_faces = num_verts
for i in range(num_faces):
face = [i, (i + 1) % num_verts, num_verts]
faces.append(face)
# メッシュオブジェクトを作成する
mesh = bpy.data.meshes.new('cone_mesh')
mesh.from_pydata(verts, [], faces)
# オブジェクトを作成して、メッシュを割り当てる
obj = bpy.data.objects.new('cone_object', mesh)
bpy.context.scene.collection.objects.link(obj)
# 3Dビューポートを更新する
bpy.context.view_layer.update()
この円錐表面に 以下の球体中心が通過したら
球体半径0.5 の球体を 0,300,0へ 動かすアニメを作って
import bpy
import random
# タグ名
tag_name = "y zrain_l_line_drops50"
# コレクションを取得する
collection = bpy.data.collections.get(tag_name)
# コレクションが存在しない場合は作成する
if not collection:
collection = bpy.data.collections.new(tag_name)
bpy.context.scene.collection.children.link(collection)
# 球体の半径を設定
radius = 5.0
# 球体を表示するかどうかのフラグ
show_sphere = True
for i in range(50):
# 球体の初期位置と移動先の位置をランダムに設定
z = random.uniform(-300, 300)
loc_a_start = (-300, 0, z)
loc_a_end = (0, 300, 0)
# 球体Aを作成し、初期位置を設定する
bpy.ops.mesh.primitive_uv_sphere_add(radius=radius, location=loc_a_start)
obj_a = bpy.context.object
# コレクションにオブジェクトを追加する
collection.objects.link(obj_a)
if not show_sphere:
obj_a.hide_render = True
# アニメーションのフレーム設定を行う
start_frame = 1 # アニメーションの最初のフレーム
end_frame_a = int(20 * bpy.context.scene.render.fps) # 球体Aの移動が終わるフレーム
bpy.context.scene.frame_start = start_frame # アニメーションの開始フレームを設定
bpy.context.scene.frame_end = end_frame_a # アニメーションの終了フレームを設定
# キーフレームを設定する
obj_a.location = loc_a_start # 球体Aの開始位置を設定
obj_a.keyframe_insert(data_path="location", frame=start_frame) # 開始フレームでキーフレームを設定
obj_a.location = loc_a_end # 球体Aの終了位置を設定
obj_a.keyframe_insert(data_path="location", frame=end_frame_a) # 終了フレームでキーフレームを設定
# アニメーション再生
bpy.ops.screen.animation_play() # アニメーションを再生
# アニメーション再生時間を5秒延長
bpy.context.scene.frame_end += 5 * bpy.context.scene.render.fps
bbb