アストラルプリズム

PC、スマホ、ゲームなどの備忘録と日記

blender python 平面のへこみを調べる

平面のへこみを調べる方法

bm.faces[0].loops[0].is_convex

凹んでいるときにfalseになる


loopにそって円になってるなら右に曲がってるのが凹みになっている
以下理屈だとこうなる

import bpy , bmesh

obj = bpy.context.object
bpy.ops.object.mode_set(mode = 'EDIT')

bm = bmesh.from_edit_mesh(obj.data)
bm.faces.ensure_lookup_table()
loops = bm.faces[0].loops
xv = loops[0]

p0 = (xv.link_loop_prev.vert.co,xv.vert.co)
p1 = (xv.vert.co,xv.link_loop_next.vert.co )
p2 = (xv.link_loop_next.vert.co ,
          xv.link_loop_next.link_loop_next.vert.co)
ps =((p0[0],p1[0],p2[0]),(p0[1],p1[1],p2[1]))

def ang_chek(ps):
    (p0,p1,p2) = ps
    v01 = (p1-p0).normalized()
    v12 = (p2-p1).normalized()
    # 角度を得る [0,Π]
    # acosの値域は[-1,1]となるので演算の誤差で範囲を超えた場合に抑える。
    def clamp(v):
        return min( max(v,-1), 1 )
    
    rad = acos( clamp(v01.dot(v12)))
 
    # 曲がる方向で符号を設定
    v02 = p2-p0
    v12_rot90 = mathutils.Vector( (-v01.y,v01.x) )
    rad = rad if v12_rot90.dot(v02) > 0 else -rad
#
    if (p0-p1).cross(p2-p1).z > 0:
        #print( "MIGI" )
        ang=False
    else: 
        #print( "HIDARI" )
        ang = True
    return ang