あ
# コレクションを作る 重複の場合 作らない
import bpy
# List of collection names
collection_names = [
"8つの正面",
"円板",
"abcdefg",
"abcdefg",
"abcdefg",
"abcdefg"
]
# Function to create a new collection if it doesn't exist
def create_collection_if_not_exists(name):
if name not in bpy.data.collections:
collection = bpy.data.collections.new(name)
bpy.context.scene.collection.children.link(collection)
# Create collections
for name in collection_names:
create_collection_if_not_exists(name)
blender python
半径1の円を作る
中心 000
xy平面に 存在する
正方形 辺長さ 2を
8個 作る
正方形の中心位置は
半径1の円周に 等間隔
この正方形は xy平面に平行ではなく
xy平面に 直角 で存在する
BlenderのPythonを使用して、半径1の円を中心(0, 0, 0)に作成し、その円周上に等間隔でXY平面に直角に存在する辺長さ2の正方形を8つ作成する方法を示します
import bpy
import math
# 半径1の円を作成
radius = 1.0
bpy.ops.mesh.primitive_circle_add(vertices=32, radius=radius, location=(0, 0, 0))
circle = bpy.context.active_object
# 8つの正方形を作成
num_squares = 8
angle_step = 360.0 / num_squares
for i in range(num_squares):
angle_rad = math.radians(i * angle_step)
x = math.cos(angle_rad)
y = math.sin(angle_rad)
# 正方形の中心位置を計算
center = (x * radius, y * radius, 0)
# 正方形の辺長さ
edge_length = 2.0
# 正方形を作成
bpy.ops.mesh.primitive_plane_add(size=edge_length, location=center)
square = bpy.context.active_object
# 正方形をXY平面に直角に回転
square.rotation_euler[0] = math.radians(90) # X軸周りの回転
square.rotation_euler[2] = angle_rad # Z軸周りの回転
# 円オブジェクトを選択解除
circle.select_set(False)
正方形が円の接線を含む平面上に存在する
import bpy
import math
# 半径1の円を作成
radius = 1.0
bpy.ops.mesh.primitive_circle_add(vertices=32, radius=radius, location=(0, 0, 0))
circle = bpy.context.active_object
# 8つの正方形を作成
num_squares = 8
angle_step = 360.0 / num_squares
for i in range(num_squares):
angle_rad = math.radians(i * angle_step)
x = math.cos(angle_rad)
y = math.sin(angle_rad)
# 正方形の中心位置を計算(円周上の接触点)
center = (x * radius, y * radius, 0)
# 正方形の辺長さの半分
half_edge_length = 1.0
# 正方形を作成
bpy.ops.mesh.primitive_plane_add(size=2 * half_edge_length, location=center)
square = bpy.context.active_object
# 正方形を円に向けて回転させる
square.rotation_euler[0] = math.radians(90) # X軸周りの回転
square.rotation_euler[2] = angle_rad + math.radians(45) # Z軸周りの回転
# 円オブジェクトを選択解除
circle.select_set(False)
import bpy
# 8角柱を作成
radius = 1.0
depth = 0.1
bpy.ops.mesh.primitive_cylinder_add(vertices=8, radius=radius, depth=depth, location=(0, 0, 0))
cylinder = bpy.context.active_object
8角柱を 半径1の円に外接させて
半径1の円に外接するような8角柱を作成するBlenderのPythonスクリプトを以下に示します。
import bpy
import math
radius = 1.0
bpy.ops.mesh.primitive_circle_add(vertices=8, radius=radius, location=(0, 0, 0))
circle = bpy.context.active_object
depth = radius * math.sqrt(2)
bpy.ops.mesh.primitive_cylinder_add(vertices=8, radius=radius, depth=depth, location=(0, 0, depth/2))
cylinder = bpy.context.active_object
circle.select_set(False)
このスクリプトでは、depth
変数に外接するための8角柱の高さを計算しています。8角形(八角形)の外接円の直径は正方形の対角線の長さに等しいため、8角柱の高さは半径1の円の直径(2 * radius)に等しくなります。ただし、円の中心と8角柱の中心が重なるため、8角柱の高さを計算する際に高さの半分(depth/2
)を指定しています。
import bpy
import math
# 半径1の円を作成
radius = 1.0
bpy.ops.mesh.primitive_circle_add(vertices=8, radius=radius, location=(0, 0, 0))
circle = bpy.context.active_object
# 8角柱を作成
depth = radius * math.sqrt(2) # 8角柱の高さ(外接するための計算)
bpy.ops.mesh.primitive_cylinder_add(vertices=8, radius=radius, depth=depth, location=(0, 0, depth/2))
cylinder = bpy.context.active_object
# 円オブジェクトを選択解除
circle.select_set(False)
2枚の正方形の法線が常に2離れるように配置
。円周と接点を持つ接線を含む平面の部分平面が正方形となるような8つの正方形を配置するBlenderのPythonスクリプトを以下に示します。
import bpy
import math
# 半径1の円を作成
radius = 1.0
bpy.ops.mesh.primitive_circle_add(vertices=8, radius=radius, location=(0, 0, 0))
circle = bpy.context.active_object
# 8つの正方形を作成して円周上に配置
num_squares = 8
angle_step = 360.0 / num_squares
for i in range(num_squares):
angle_rad = math.radians(i * angle_step)
x = math.cos(angle_rad)
y = math.sin(angle_rad)
# 正方形の中心位置を計算(円周上の接触点)
center = (x * radius, y * radius, 0)
# 正方形を作成して円に向けて配置
bpy.ops.mesh.primitive_plane_add(size=2, location=center)
square = bpy.context.active_object
# 正方形をXY平面に垂直に回転
square.rotation_euler[1] = math.radians(90) # Y軸周りの回転
square.rotation_euler[2] = angle_rad # Z軸周りの回転
# 正方形の中心から円周上の正方形の中心まで移動
square.location.x += x * radius
square.location.y += y * radius
# 円オブジェクトを選択解除
circle.select_set(False)
# 全てのオブジェクトを選択解除
bpy.ops.object.select_all(action='DESELECT')
import bpy
import math
# 画像ファイルのパスを指定してください
image_path = "C:/atest/20230806 赤城神社 tree 切り取り 2.png"
# 半径1の円を作成
radius = 1.0
bpy.ops.mesh.primitive_circle_add(vertices=8, radius=radius, location=(0, 0, 0))
circle = bpy.context.active_object
# 8つの正方形を作成して円周上に配置
num_squares = 8
angle_step = 360.0 / num_squares
for i in range(num_squares):
angle_rad = math.radians(i * angle_step)
x = math.cos(angle_rad)
y = math.sin(angle_rad)
# 正方形の中心位置を計算(円周上の接触点)
center = (x * radius, y * radius, 0)
# 正方形を作成して円に向けて配置
bpy.ops.mesh.primitive_plane_add(size=2, location=center)
square = bpy.context.active_object
# 正方形をXY平面に垂直に回転
square.rotation_euler[1] = math.radians(90) # Y軸周りの回転
square.rotation_euler[2] = angle_rad # Z軸周りの回転
# 正方形の中心から円周上の正方形の中心まで移動
square.location.x += x * radius
square.location.y += y * radius
# イメージテクスチャを読み込み
img = bpy.data.images.load(image_path)
# テクスチャを設定
mat = bpy.data.materials.new(name="ImageMaterial")
square.data.materials.append(mat)
square.active_material.use_nodes = True
bsdf = square.active_material.node_tree.nodes["Principled BSDF"]
tex_image = square.active_material.node_tree.nodes.new("ShaderNodeTexImage")
square.active_material.node_tree.links.new(bsdf.inputs['Base Color'], tex_image.outputs['Color'])
tex_image.image = img
# 円オブジェクトを選択解除
circle.select_set(False)
# 全てのオブジェクトを選択解除
bpy.ops.object.select_all(action='DESELECT')
ノードで -90度回転
画像を90度回転させて8枚の正方形に貼り付けるBlenderのPythonスクリプトを以下に示します。