# コレクションを作成
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]
# A, B, Cそれぞれのコレクションを作成
for c in ["A", "B", "C"]:
child_collection_name = f"{collection_name}_{c}"
if child_collection_name not in bpy.data.collections:
child_collection = bpy.data.collections.new(child_collection_name)
zionad_collection.children.link(child_collection)
else:
child_collection = bpy.data.collections[child_collection_name]
長さで 分けて 2長さと 2√2長さと 2√3長さで オブジェクト名を分類
以下のように、円柱の長さを判定し、オブジェクト名の先頭に"Length_"とつけて、それぞれ"2.0", "2sqrt2", "2sqrt3"に分類して連番をつける
注意点として、円柱の長さは計算誤差があるため、上記のようにabs(distance - 長さ)での比較では、誤差を許容できる範囲内におさまるような値で比較する必要があります。
以下は、2√2と2√3の中間値をmiddle2として、それを使って頂点座標に対応する3つの円柱の長さを分類し、それぞれA、B、Cという名前のオブジェクトとしてBlenderに描画するPythonスクリプトです。
# 立方体の 辺 2長さ と 対角線 2√2 3√2
import bpy
import mathutils
import math
# 頂点座標
vertex_coords = [(1,1,1), (-1,1,1), (-1,-1,1), (1,-1,1), (1,1,-1), (-1,1,-1), (-1,-1,-1), (1,-1,-1)]
# 2つの中間値を求める
middle1 = (2 + 2*math.sqrt(2))/2
middle2 = (2*math.sqrt(2) + 2*math.sqrt(3))/2
# 頂点座標を順番に参照し、円柱を描画する
for i in range(len(vertex_coords)):
for j in range(i+1, len(vertex_coords)):
v1 = mathutils.Vector(vertex_coords[i])
v2 = mathutils.Vector(vertex_coords[j])
distance = (v1-v2).length
location = (v1+v2)/2
bpy.ops.mesh.primitive_cylinder_add(radius=0.05, depth=distance, location=location)
cylinder = bpy.context.object
cylinder.name = f"cylinder_{i}_{j}"
# 球体を頂点に対応させるため、円柱の向きを変える
z_axis = mathutils.Vector((0, 0, 1))
rotation = z_axis.rotation_difference(v2-v1)
cylinder.rotation_mode = 'QUATERNION'
cylinder.rotation_quaternion = rotation
# 円柱の長さによって、A, B, Cに分類する
for obj in bpy.context.scene.objects:
if obj.name.startswith("cylinder_"):
length = obj.dimensions[2]
if length < middle1:
obj.name = obj.name.replace("cylinder", "cylinder_A")
elif length < middle2:
obj.name = obj.name.replace("cylinder", "cylinder_B")
else:
obj.name = obj.name.replace("cylinder", "cylinder_C")
zion_lengthとzion_cube_centerを変更することで、立方体の辺長と中心座標を変更できます。
# 汎用 設定 立方体の骨格 円柱 辺 と 対角線 √2 √3
iimport bpy
import mathutils
import math
# 立方体の辺の長さと、中心座標
zion_length = 3
zion_cube_center = (0, 0, 0)
# 頂点座標を計算
vertex_coords = []
for i in range(2):
for j in range(2):
for k in range(2):
vertex_coords.append((
zion_cube_center[0] + (i-0.5)*zion_length,
zion_cube_center[1] + (j-0.5)*zion_length,
zion_cube_center[2] + (k-0.5)*zion_length
))
# 2つの中間値を求める
middle1 = (2 + 2*math.sqrt(2))/2
middle2 = (2*math.sqrt(2) + 2*math.sqrt(3))/2
# 頂点座標を順番に参照し、円柱を描画する
for i in range(len(vertex_coords)):
for j in range(i+1, len(vertex_coords)):
v1 = mathutils.Vector(vertex_coords[i])
v2 = mathutils.Vector(vertex_coords[j])
distance = (v1-v2).length
location = (v1+v2)/2
bpy.ops.mesh.primitive_cylinder_add(radius=0.05, depth=distance, location=location)
cylinder = bpy.context.object
cylinder.name = f"cylinder_{i}_{j}"
# 球体を頂点に対応させるため、円柱の向きを変える
z_axis = mathutils.Vector((0, 0, 1))
rotation = z_axis.rotation_difference(v2-v1)
cylinder.rotation_mode = 'QUATERNION'
cylinder.rotation_quaternion = rotation
# 円柱の長さによって、A, B, Cに分類する
for obj in bpy.context.scene.objects:
if obj.name.startswith("cylinder_"):
length = obj.dimensions[2]
if length < middle1:
obj.name = obj.name.replace("cylinder", "cylinder_A")
elif length < middle2:
obj.name = obj.name.replace("cylinder", "cylinder_B")
else:
obj.name = obj.name.replace("cylinder", "cylinder_C")
# コレクションを作成
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]
# 円柱をコレクションに追加
for obj in bpy.context.scene.objects:
if obj.name.startswith("cylinder_"):
if obj.name.endswith("_A"):
zionad_collection.objects.link(obj)
elif obj.name.endswith("_B"):
zionad_collection.objects.link(obj)
elif obj.name.endswith("_C"):
zionad_collection.objects.link(obj)
#原型の円柱での 立方体 骨格
import bpy
import mathutils
# 頂点座標
vertex_coords = [(1,1,1), (-1,1,1), (-1,-1,1), (1,-1,1), (1,1,-1), (-1,1,-1), (-1,-1,-1), (1,-1,-1)]
# 頂点座標を順番に参照し、円柱を描画する
for i in range(len(vertex_coords)):
for j in range(i+1, len(vertex_coords)):
v1 = mathutils.Vector(vertex_coords[i])
v2 = mathutils.Vector(vertex_coords[j])
distance = (v1-v2).length
location = (v1+v2)/2
bpy.ops.mesh.primitive_cylinder_add(radius=0.05, depth=distance, location=location)
cylinder = bpy.context.object
cylinder.name = f"cylinder_{i}_{j}"
# 球体を頂点に対応させるため、円柱の向きを変える
z_axis = mathutils.Vector((0, 0, 1))
rotation = z_axis.rotation_difference(v2-v1)
cylinder.rotation_mode = 'QUATERNION'
cylinder.rotation_quaternion = rotation