夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

BlenderPythonで面の方程式を取得する

本日はBlenderPython枠です。

先日はBlenderで辺の方程式を求めました。

今回は頂点3つから構成される面について方程式を取得します。

〇面の方程式

面の方程式を得るためにまずはベクトル計算を行います。

今回は仮に三つの頂点を(x1,y1,z1)(x2,y2,z2)(x3,y3,z3)とします。

考え方としてはまず最初の2つの頂点を通るベクトル(辺ベクトルα)と最初と3つ目の頂点を通るベクトル(辺ベクトルβ)を計算します。

これは次のようになります。

 \displaystyle
α= (x_2-x_1,y_2-y_1,z_2-z_1) \
 \displaystyle
β= (x_3-x_1,y_3-y_1,z_3-z_1) \

次に法線ベクトルを計算します。 ここでいう法線ベクトルはメッシュの法線ベクトルに相当します。

αとβが求められているのでここから法線ベクトルnを求めるにはαとβの外積を計算することで求めることができます

 \displaystyle
n_x= y_2y_3-y_1z_3 \
 \displaystyle
n_y=z_1x_3 -x_2z_3 \
 \displaystyle
n_z=x_2y_3-y_2x_3 \

求めた情報を使用して平面の方程式を求めます。

 \displaystyle
n_x(x-x_1)+n_y(y-y_1)+n_z(z-z_1)=0 \

この式が面の方程式になります。

Pythonで実装してBlenderで面の方程式を取得する

では上記の面の方程式をBlenderに落とし込みます。

上記のような面を例に面の方程式を計算する処理は次のようになります。

import bpy
import bmesh
from mathutils import Vector

# 3つの頂点
v1 = Vector((-1, 1, 0.27012 ))
v2 = Vector((-1, -1, -1))
v3 = Vector((1, 1, 0.707946 ))

# 2つのベクトルを計算
vec1 = v2 - v1
vec2 = v3 - v1

# 法線ベクトルを計算
normal = vec1.cross(vec2)

# 平面の方程式のDを計算
D = -v1.dot(normal)

# 平面の方程式を表示
print(f"The equation of the plane is {normal[0]}x + {normal[1]}y + {normal[2]}z + {D} = 0")

これを実行するとコンソールに次のように結果が出力されます。

 \displaystyle
 -0.875652015209198x + -2.5402400493621826y + 4.0z + 0.5841080546379089 = 0\

確かめるために上記式に頂点1(-1, 1, 0.27012 )を代入します。

0.8756532015209198 + -2.5402400493621826 +1.08048+0.5841080546379089の結果は0となり確かめることができました。

つまり、上記方程式に代入し結果が0となるX,Y,Zの値はこの平面上に収まる頂点ということになります。

本日は以上です。