平面をオブジェクトモードで拡大縮小してから編集モードで回転させてcalc_angle()で角の角度を取得すると値がおかしい。
3Dビューのビューポートオーバーレイで面の角度表でも同じ現象が起きてる
内部が同じかどうかはさておき、おそらく編集モードで回転させたものに後からオブジェクトモードの拡大縮小を計算してる。
なのでcalc_angle()は使わない方がよさそうだ。
calc_angle()、calc_edge_angle()については検索してもあまり情報は無くて、本当にあんまり使い勝手が悪いコマンドなのかも・・・?
ビューポートオーバーレイもバグかと思ったけど、マウスオーバーすると「グローバル値を使い選択中の面の角度を・・・」ってあるからまあ、グローバルと言えばグローバルなのか???
とにかくcalc_angle()は使わずに代わりにmathutilsのベクトル間の角度を求めるangle()を使うことにしよう。
import bpy ,bmesh,math obj = bpy.context.object msh = obj.data mat = obj.matrix_world bm = bmesh.from_edit_mesh(msh) loop = bm.faces[0].loops #bm.faces[0].loops[0].calc_angle()の代わり v0 = mat @ loop[0].vert.co-mat @ loop[0].link_loop_next.vert.co v1 = mat @ loop[0].link_loop_prev.vert.co-mat @ loop[0].edge.vert.co rad = v0.angle(v1) deg = math.degrees(rad) print(180-deg) ループさせて調べる場合 import bpy ,bmesh,math,mathutils obj = bpy.context.object msh = obj.data mat = obj.matrix_world bm = bmesh.from_edit_mesh(msh) loop = bm.faces[0].loops no=list(range(len(loop))) no.append(0) for i,l in enumerate(bm.faces[0].loops): #print(no[i]) v0 = mat @ loop[no[i]].vert.co-mat @ loop[no[i]].link_loop_next.vert.co v1 = mat @ loop[no[i]].link_loop_prev.vert.co-mat @ loop[no[i]].vert.co rad = v0.angle(v1) deg = math.degrees(rad) print(180-deg)