法線

最終更新日26 May 2017 10:50

平面の法線

平面の方程式

(1)
\begin{equation} ax+by+cz=d \end{equation}

があったとき、平面の法線は$n = (a,b,c)$です。

線の法線

平面の時の2次元版と考えればよいので

(2)
\begin{equation} ax+by=c \end{equation}

線の法線は$n = (a,b)$です。

頂点の法線

スムースシェーディングで使われる。

OpenGL2で法線を渡す方法

法線の長さは1でなければならない。

OpenGLで法線を有効化する

  • glEnable(GL_NORMALIZE);
  • glEnable(GL_RESCALE_NORMAL)

これらって、法線の長さをちゃんと1にするためのものらしいわよ。

OpenGLで法線の自動計算

glEnable(GL_AUTO_NORMAL);

これを使うと処理時間がかかっちゃうらしい。
GLAUX ライブラリに存在するらしい。
GLAUXとはOpenGLの補助ライブラリ。
現在では GLUT ライブラリに置き換わった一世代前のライブラリらしい。
じゃあ、これは古いかな。
glEvalCoord()

立方体の法線

は、単純に考えてよさそう。こんなかんじに

void DrawQuadsWithNormal(){
            glBegin(GL_QUADS);
            glNormal3f(0.0,0.0,-1.0);
            corner[0].glVertex();corner[3].glVertex();corner[2].glVertex();corner[1].glVertex();
            glNormal3f(0.0,-1.0,0.0);
            corner[0].glVertex();corner[1].glVertex();corner[5].glVertex();corner[4].glVertex();
            glNormal3f(-1.0,0.0,0.0);
            corner[0].glVertex();corner[4].glVertex();corner[7].glVertex();corner[3].glVertex();
 
            glNormal3f(0.0,1.0,0.0);
            corner[6].glVertex();corner[2].glVertex();corner[3].glVertex();corner[7].glVertex();
            glNormal3f(0.0,0.0,1.0);
            corner[6].glVertex();corner[7].glVertex();corner[4].glVertex();corner[5].glVertex();
            glNormal3f(1.0,0.0,0.0);
            corner[6].glVertex();corner[5].glVertex();corner[1].glVertex();corner[2].glVertex();
            glEnd();
        }

三角形の法線の計算

vec3 normal = cross(b-a,c-a);
  • a,b,c…三角形を構成する頂点の座標
  • normal…法線
  • cross外積を計算する関数

球の法線の計算

vec3 normal = p-sphereCenter;
  • p球面上に存在する点
  • normal….法線
  • sphereCenter…球の中心座標

[1]より

ある任意の点における法線を計算するには?

レイトレーシングシェーディングする時は任意の点の法線を計算しないといけなくなる。はたしてどうやってやるのか?
facing ratioと呼ばれる方法を使ってやるらしい[1]


triangle-cross-product


ファイル

サポートサイト Wikidot.com triangle-cross-product