アストラルプリズム

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

blender python 角度の値がおかしい時

平面をオブジェクトモードで拡大縮小してから編集モードで回転させてcalc_angle()で角の角度を取得すると値がおかしい。
3Dビューのビューポートオーバーレイで面の角度表でも同じ現象が起きてる
f:id:katsumi3:20200310232316p:plain
f:id:katsumi3:20200310232419p:plain

f:id:katsumi3:20200310232552p:plain
どの辺も90°になるはずなのだが・・・

内部が同じかどうかはさておき、おそらく編集モードで回転させたものに後からオブジェクトモードの拡大縮小を計算してる。
なので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)