夜風のMixedReality

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

BlenderPythonで面の面積を求める

本日はBlenderPython枠です。

昨日はBlenderPythonを使用して、頂点3つから構成されるメッシュの面の方程式を求めました。

本日はここで求める面の面積を算出します。

2次元でのおさらいですが、3つの座標で構成される図形の面積を求めるには

三次元空間上の頂点(x1,y1,z1)(x2,y2,z2)(x3,y3,z3)で構成されるメッシュの面積は次のステップで計算します。

1 まず1つ目の頂点から二つ目の頂点の辺ベクトルαと、1つ目の頂点から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) \

2 αとβのベクトルの外積を取ります。

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

 -(x_2-x1)*(z_3- z_1),(x_2-x_1)*(y_3-y_1)-(y_2- y_1 )*(x_3 - x_1) \

ここで求められたベクトルの大きさ(長さ)はもとの三角形の2倍となるため2で割ることで凍メッシュの面積を求めることができます。

この方法は頂点座標が判明している場合の方法になりますが、Blenderで頂点を扱う場合は存在している頂点に関してはすべて座標等のデータを取得できるため問題はありません。

Blender Pythonで実装する

Blender Pythonで実装すると次のようになります

import bpy
from mathutils import Vector

# 3つの頂点を定義
v1 = Vector()
v2 = Vector()
v3 = Vector()

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

# 外積を計算
cross_product = vec1.cross(vec2)

# 面積を計算
area = cross_product.length / 2.0

print("The area of the triangle is", area)

次の面積を求めていきます。

この頂点内容を入れて実行することで次のような出力を得ることができます。

ではビューポートオーバーレイで面積を表示して結果を確かめます。

一致していることが確認できました。よって正しく面積の計算ができているようです。

このあたりの知識は高校数学レベルの内容だと思いますが、改めてさらっていくと忘れていることも多く勉強になります。

本日は以上です。