blender python で
半径1の球体を 作る
中心は000
y<0の部分と
y>=0の部分に別ける
2つの部分にオブジェクト名を付ける
Y>=0 の 半分の球体と Y<=0 の 半分の球体を描いて オブジェクト名も付ける
import bpy
import bmesh
import mathutils
import math
# Y>=0 の半分の球体を作成する
bpy.ops.mesh.primitive_uv_sphere_add(location=(0, 0, 0.5), radius=0.5, segments=32, ring_count=16)
half_sphere_top = bpy.context.active_object
half_sphere_top.name = "Half Sphere Top"
# Y<=0 の半分の球体を作成する
bpy.ops.mesh.primitive_uv_sphere_add(location=(0, 0, -0.5), radius=0.5, segments=32, ring_count=16)
half_sphere_bottom = bpy.context.active_object
half_sphere_bottom.name = "Half Sphere Bottom"
# 2つのオブジェクトを結合する
bpy.context.view_layer.objects.active = half_sphere_bottom
bpy.ops.object.mode_set(mode='EDIT')
bm = bmesh.from_edit_mesh(bpy.context.object.data)
bm.select_mode = {'VERTEX'}
bm.select_flush(mode='VERT')
bm.select_all(action='SELECT')
bpy.ops.mesh.delete(type='VERT')
bpy.ops.object.mode_set(mode='OBJECT')
bpy.ops.object.select_all(action='DESELECT')
half_sphere_top.select_set(True)
half_sphere_bottom.select_set(True)
bpy.context.view_layer.objects.active = half_sphere_top
bpy.ops.object.join()
# オブジェクトを選択する
bpy.context.view_layer.objects.active = bpy.context.selected_objects[0]
作って欲しいのは
半径1の球体を半分に切った形の物体 2つだ
2つの球体ではない
import bpy
import bmesh
import math
# オブジェクトの名前
obj_name = "half_sphere"
# 半径1の球体を作成
bpy.ops.mesh.primitive_uv_sphere_add(radius=1.0, enter_editmode=False, location=(0,0,0))
# オブジェクトを取得
obj = bpy.context.object
# オブジェクトのメッシュを取得し、bmeshを作成
me = obj.data
bm = bmesh.new()
bm.from_mesh(me)
# bmeshを操作して球体の半分を削除
for v in bm.verts:
if v.co[1] < 0:
bm.verts.remove(v)
# bmeshをメッシュに適用してオブジェクトを更新
bm.to_mesh(me)
me.update()
# オブジェクト名を設定
obj.name = obj_name + "_bottom"
# オブジェクトの位置を変更
obj.location = (0, -1, 0)
# 新しいオブジェクトを作成して半球を作成
bpy.ops.object.duplicate_move(OBJECT_OT_duplicate={"linked":False, "mode":'TRANSLATION'}, TRANSFORM_OT_translate={"value":(0, 2, 0), "orient_type":'GLOBAL'})
# 新しいオブジェクトを取得
obj = bpy.context.object
# オブジェクトのメッシュを取得し、bmeshを作成
me = obj.data
bm = bmesh.new()
bm.from_mesh(me)
# bmeshを操作して球体の半分を削除
for v in bm.verts:
if v.co[1] > 0:
bm.verts.remove(v)
# bmeshをメッシュに適用してオブジェクトを更新
bm.to_mesh(me)
me.update()
# オブジェクト名を設定
obj.name = obj_name + "_top"
1つの球体を 2つに割って
2つのオブジェクトをつくって名前を付ける
元の球体中心は 000
import bpy
import bmesh
from mathutils import Vector, Matrix
import math
# オブジェクトの名前
obj_name = "half_sphere"
# 半径1の球体を作成
bpy.ops.mesh.primitive_uv_sphere_add(radius=1.0, enter_editmode=False, location=(0,0,0))
# オブジェクトを取得
obj = bpy.context.object
# オブジェクトのメッシュを取得し、bmeshを作成
me = obj.data
bm = bmesh.new()
bm.from_mesh(me)
# 円周の方程式 y^2 + z^2 = 1 の y > 0 の部分の面を削除
for f in bm.faces:
if all([v.co.y > 0 for v in f.verts]):
bm.faces.remove(f)
# bmeshをメッシュに適用してオブジェクトを更新
bm.to_mesh(me)
me.update()
# オブジェクト名を設定
obj.name = obj_name
# オブジェクトの位置を変更
obj.location = (0, 0, 0)
import bpy
import math
# 新しいメッシュオブジェクトを作成
mesh = bpy.data.meshes.new("Square")
# 頂点の座標
a = 5
center = (0, - math.sqrt(3) /2, 0)
verts = [
(center[0] - a/2, center[1], center[2] + a/2),
(center[0] + a/2, center[1], center[2] + a/2),
(center[0] + a/2, center[1], center[2] - a/2),
(center[0] - a/2, center[1], center[2] - a/2)
]
# 面を構成する頂点のインデックス
faces = [(0, 1, 2, 3)]
# メッシュに頂点と面を追加
mesh.from_pydata(verts, [], faces)
# メッシュをオブジェクトに割り当て、シーンに追加
obj = bpy.data.objects.new("Square", mesh)
bpy.context.scene.collection.objects.link(obj)
y <= - math.sqrt(3) /2 の部分だけの 半径1の球体 中心000を描いて
失敗
円錐
import bpy
import math
# 円錐の高さ
h = math.sqrt(3) / 2
# 底面の半径
r = 0.5
# 円錐を作成
bpy.ops.mesh.primitive_cone_add(
vertices=32,
radius1=0.0,
radius2=r,
depth=h,
location=(0, -h / 2, 0),
rotation=(math.pi / 2, 0, 0)
)
# 円錐を選択
cone = bpy.context.active_object
# 頂点の座標を取得
vertices = [v.co for v in cone.data.vertices]
# 底面の頂点を選択
bottom_vertices = [v for v in vertices if abs(v.y + h / 2) < 0.00001]
# 底面の頂点に UV マップを追加
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_all(action='DESELECT')
for v in bottom_vertices:
cone.data.vertices[v.index].select = True
bpy.ops.uv.smart_project(angle_limit=66, island_margin=0, user_area_weight=0)
bpy.ops.object.mode_set(mode='OBJECT')
#画面の球体 1
import bpy
import math
# オブジェクトの名前
name = "画面_sphere"
# 球体の中心座標
center = (0, -math.sqrt(3)/2, 0)
# 球体の半径
radius = 1
# 球体を作成
bpy.ops.mesh.primitive_uv_sphere_add(
enter_editmode=False,
location=center,
radius=radius,
)
# オブジェクト名を変更
bpy.context.active_object.name = name
#画面の球体 math.sqrt(3)/2
import bpy
import math
# オブジェクトの名前
name = "画面_sphere"
# 球体の中心座標
center = (0, -math.sqrt(3)/2, 0)
# 球体の半径
radius = math.sqrt(3)/2
# 球体を作成
bpy.ops.mesh.primitive_uv_sphere_add(
enter_editmode=False,
location=center,
radius=radius,
)
# オブジェクト名を変更
bpy.context.active_object.name = name