2023年4月22日土曜日

20230422 sat ビデオ会議の構造 test版 半径√3へ 修正へ

 


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