アストラルプリズム

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

Blender python頂点間の距離を取得する5つの方法

頂点1と頂点3の距離を知りたい

f:id:katsumi3:20200212234130p:plain

 

方法は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)