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ノードって対象にヒットしないと使えないんですよね。当たり前ですけど。けど、対象がグリッドの時、そのグリッドを無限平面と見立てて交点を知りたいシチュエーションがあったりしたんですよ。
まぁ高校数学の役に立つこと…。復習しないと(復習ってより、新たに学び直すに近いな(^^;)
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 ( )
« そいえばInter...・ProRes変換 »
コメント |
コメントはありません。 |
コメントを投稿する |
ブログ作成者から承認されるまでコメントは反映されません |