Homogeneous(同次)座標系を使ったClipping
OpenGLライブラリの中には、glClipPlane(https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glClipPlane.xml)という関数がある。この関数は平面を表すベクトル(というより、数の組)を受け取り、受け取った平面でクリッピングを行う。クリッピングの方法として、
If the dot product of ... a vertex with the stored plane equation components is positive or zero, the vertex is in with respect to that clipping plane. Otherwise, it is out.
と書かれているが、これで本当にクリッピングができるのか考えてみた。
前提
plane equation components
三次元空間内の二次元平面は、homogeneous座標系
cartesian座標系で(x, y, z)と表される点は、homogeneous座標系においては0でない任意数wを新たに導入して(wx, wy, wz, w)と表される。とくに、w=1のとき(普通はそうする)は(x, y, z, 1)となる。wは遠近法を考えるときに使えたりするのだけれど、省略。homogeneous座標系についての詳細はhttps://en.wikipedia.org/wiki/Homogeneous_coordinatesとかで読んでね。以降の説明では、homogeneous座標系の点(x, y, z, 1)とcartesian座標系の点(x, y, z)を同一視する。考えてみる
the dot product of a vertex with the stored plane equation componentsは、vertexの座標をDが0でないとき
plane equation components (A, B, C, D)で構成される平面より、cartesian座標が
となる。これは、平面

dotが正であるところがクリッピングされるのだったから、Dが正だとすると、この場合は平面に対して左側がクリッピングされることになる。
一方、plane equation components (-A, -B, -C, -D)で構成される平面もまた平面
である。この場合についても先ほどと同じように考えてみる。平面
上のあるvertexの座標が
だったとする。すると、
より、cartesian座標が
となり、先ほどの場合のdotの値(1-s)Dとは符号が反転している。この場合の模式図は、

となるので、Dが正だとすると、平面に対して右側がクリッピングされることになる。先ほどは左側がクリッピングされていたので、クリッピングの範囲が入れ替わっている。
Dが0でないときのまとめ
Dが0でないときには、Dの符号によってクリッピングされる範囲を瞬時に判断することができる。plane equation componentsが(A, B, C, D)であるとき、D>0ならば平面によって分けられた二つの空間のうち、原点を含む方がクリッピングされ、D<0ならば、原点を含まない方がクリッピングされる。このような仕組みで、単純に内積を取るだけでクリッピングができる。だが、D=0の場合には上の議論は破綻してしまう。模式図を見ても、D=0の時には全ての平面が一つになってしまうので、空間内の全てのvertexの内積について言及していないことが明らかにわかる。そこで、D=0のときは別に考えてみる。
Dが0のとき
plane equation componentsが(A, B, C, 0)であり、それが構成する平面をplane equation componentsが(A, B, C, 0)であり、それが構成する平面をとする。座標が
のvertexの内積
は、ベクトル(A, B, C)とベクトル
の内積に等しい。これより下図のように、ベクトル
が平面
に対してベクトル(A, B, C)と同じ方向にあるときはdotが正、逆方向にあるときはdotが負になる。

よってこの場合、平面の上側がクリッピングされる。
一方、plane equation componentsが(-A, -B, -C, 0)であるときも、それが構成する平面はと同じである。先ほどと同じように考えると、ベクトル
が平面
に対してベクトル(-A, -B, -C)と同じ方向にあるときはdotが正、逆方向にあるときはdotが負になる。

よってこの場合には、平面の下側がクリッピングされる。