平面

plane.png

平面の定義

平面は3種類の方法で定義できる

  1. 3つの点
  2. 法線と一つの点
  3. 法線と原点からの距離
(1)
\begin{equation} ax+by+cz+d=0 \end{equation}

a,b,cは平面の法線の成分である

(2)
\begin{equation} n=(a,b,c) \end{equation}

なのでこうやって表記されることもある

(3)
\begin{equation} n ・ X=d \end{equation}

これは、原点から法線の方向へd進んだ距離に平面があることを表します

3点から平面を定義する

3つの点A,B,Cから平面を定義しようと思う。
パラメトリックに表現すると、こうなる

(4)
\begin{equation} P(u,v)=A+u(B-A)+v(C-A) \end{equation}

A,B,Cは反時計周りに並んでいるとする。
すると、平面の法線はこうなる

(5)
\begin{align} n=(B-A)\times(C-A) \end{align}

外積である。

この3点は、同一直線上にないことが、平面にできることの条件。

void set3Points( vec3<T> &_v1,  vec3<T> &_v2,  vec3<T> &_v3){
                        vec3<T> aux1, aux2;//計算のために使用する一時的な変数
                        aux1 = _v1 - _v2;
                        aux2 = _v3 - _v2;
                        normal =aux2.cross(aux1);// aux2 * aux1;
                        normal.normalize();
                        point=_v2;
                        distance = -(normal.innerProduct(point));
                }

平面の表裏って??

上のコードを2お利用するにしても、どんな風に3つの点を渡せば、思った通り平面の裏表を支配できるのか?気になりますね。
ちゃんと気をつけなければなりません。

右手座標系 OpenGL 3点を反時計周りに渡すと
左手座標系 DirectX 3点の時計周りに渡すと

原点から平面の距離はなぜ内積?

平面の方程式はこうやっても表せますよね?

(6)
\begin{equation} n_xx+n_yy+n_zz=d \end{equation}

これって内積の式と同じよね?
平面上のある点p=(x,y,z)とすると

(7)
\begin{equation} d=n ・ p \end{equation}

だからdは内積なのだ。

法線と一つの点から平面を定義

法線と、平面上にあるとされるある点Pが与えられたとする。
平面上にあるすべての点XとPのなすベクトル(X-P)はすべてnに対して垂直ですね?
垂直ってことは、nと(X-P)の内積は0になるってこと。

(8)
\begin{equation} n・(X-P)=0 \end{equation}

こうすると、陰関数形式で表現された平面の方程式になる。
内積は線形な演算なので分配法則が使える。なので

(9)
\begin{align} n・X-n・P=0\\ n・X=n・P\\ n・X=d \end{align}

この式の形式はconstant-normal形式と呼ばれるらしい。
もし法線nが正規化されているなら、dは原点からの距離を意味する。

本当にn・x=dだけで足りる???

n・x=dだけですべての平面を表現しきれるだろうか?
いいえ、できません。
この式には平行移動という概念がありません。
法線の向きはあくまで原点基準。

参考にした本

サポートサイト Wikidot.com