頂点1と頂点3の距離を知りたい
方法は5つある。
・公式から計算する
・calc_lengthで辺2の長さを取得する(ローカル座標のみ)
・.lengthを使う
・numpyを使う
・scipyを使う(blenderにPIP必要)
公式から計算する
この場合はそんなに長くないし確実にやってることが確認できるので悪くない
calc_lengthで辺2の長さを取得する
calc_lengthはローカル座標でしか距離が取れないけど形状が複雑じゃなくて重たくならなそうならオブジェクトをコピーして
bpy.ops.object.transform_apply(location=True, rotation=True, scale=True)
で変形を全適用したものから長さを測れば問題ない。
.lengthを使う
すごく便利という事以外に言うことない。
ライブラリを呼び出す必要もないし、便利。
numpyを使う
numpyは便利だけどimportがすこし遅いのでcalc_lengthかlengthを使うのが早いと思う。
scipyを使う
そもそもblenderに標準搭載されてないのでblenderの入ってる場所にpipする必要あり。
↓2.7系の時に別のモノだけどpipした時のメモ
勝己の3DCGメモ - blenderにopencvの代わりにscikit-image入れた
2.8系ではまだ試してない。
import bpy , bmesh
from math import sqrt
import numpy as np
obj = bpy.context.object
bpy.ops.object.mode_set(mode = 'EDIT')
bm = bmesh.from_edit_mesh(obj.data)
bm.verts.ensure_lookup_table()
bm.edges.ensure_lookup_table()
v0 = bm.verts[1].co
v1 = bm.verts[3].co
mat = obj.matrix_world
#公式から求める_____________
(x1,y1,z1) = mat @ v1
(x0,y0,z0) = mat @ v0
edge_length = sqrt((x1-x0)**2 + (y1-y0)**2 + (z1-z0)**2)
print(edge_length)
#bmeshのcalc_lengthを使う__________
edge_length = bm.edges[2].calc_length()
print(edge_length)
#.lengthを使う_______________
edge_length = (mat @ (v1 - v0)).length
print(edge_length)
#numpyを使う_______________________________
y = np.array(mat @ v0)
x = np.array(mat @ v1)
edge_length = np.linalg.norm(x-y)
print(edge_length)
#scipyを使う(ただしblender自体にpipが必要)___
from scipy.spatial import distance
x = mat @ v1
y = mat @ v0
edge_length = distance.euclidean(x, y)
print(edge_length)