日々適当

hibitekitou

平面と直線の交点

sansu |2011-11-22
平面を表す式は

ax + by + cz + d = 0

とかなんとか。しかして、法線が分かっているなら、その法線ベクトル

N = ( nx, ny, nz)

を利用して、

nx*x + ny * y + nz * z - (nx*xp0 + ny*yp0 + nz * zp0) = 0

とか表すことが出来ます。あ、(xp0, yp0, zp0) は平面上の任意の一点ね。

一方、直線を表す式は、直線に平行な単位ベクトルを (ax, ay, az) 、直線上の任意の点を (xl0, yl0, zl0) として、

(x - xl0)/ax = (y - yl0)/ay = (z - zl0)/az

と表すようです(ベクトル云々でこの式は導けます)。

んじゃ、この交点はというと、まず、直線の式を、

(x - xl0)/ax = (y - yl0)/ay = (z - zl0)/az = t

とおいて、

x = ax * t + xl0
y = ay * t + yl0
z = az * t + zl0

とした上で、これを平面の式に代入します。

nx * (ax * t + xl0) + ny * (ay * t + yl0) + nz * (az * t + zl0) - (nx * xp0 + ny * yp0 + nz * zp0) = 0

tについて解くと、

t = ((nx * xp0 + ny * yp0 + nz * zp0) - (nx * xl0 + ny * yl0 + nz + zl0))/(nx * ax + ny * ay + nz * az)

ってことで、

x = ax * ((nx * xp0 + ny * yp0 + nz * zp0) - (nx * xl0 + ny * yl0 + nz + zl0))/(nx * ax + ny * ay + nz * az) + xl0
y = ay * ((nx * xp0 + ny * yp0 + nz * zp0) - (nx * xl0 + ny * yl0 + nz + zl0))/(nx * ax + ny * ay + nz * az) + yl0
z = az * ((nx * xp0 + ny * yp0 + nz * zp0) - (nx * xl0 + ny * yl0 + nz + zl0))/(nx * ax + ny * ay + nz * az) + zl0

とか何とか。すっかり忘れているけど高校の数学なんだと思う。

んじゃ、これを実装しましょう。



ツリーとしてはこの程度。ただし、上記数式はコンパウンドないで実装しています。



そのまんまですね。しかし、これでとりあえずうまくいっているようです。



とか考えていたのはですね。raycastノードって対象にヒットしないと使えないんですよね。当たり前ですけど。けど、対象がグリッドの時、そのグリッドを無限平面と見立てて交点を知りたいシチュエーションがあったりしたんですよ。

まぁ高校数学の役に立つこと…。復習しないと(復習ってより、新たに学び直すに近いな(^^;)
コメント ( 0 )|Trackback ( )
 
コメント
 
コメントはありません。
コメントを投稿する
ブログ作成者から承認されるまでコメントは反映されません
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。