法線

normal.png

平面の法線

平面の方程式

(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)$です。

法線を渡す方法

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

法線を有効化する

  • glEnable(GL_NORMALIZE);
  • glEnable(GL_RESCALE_NORMAL)

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

法線の自動計算

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();
        }

法線の計算

void CalcNormals(){//法線情報を持っていないplyデータの法線を計算する。
            for(int i=0;i<facenum;i++){
                tri<float> tri(m_Verts[indices[i*3+0]],m_Verts[indices[i*3+1]],m_Verts[indices[i*3+2]]);
                vec3<float> normal=tri.CalcNormalVector();
                normals[indices[i*3+0]]=normal;
            }
        }

triangle-cross-product

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