影をつける

2010年1月7日

ファイル

27-shadow.tar.gz

見所

トーラスの影を、光源に対する床へのトーラスの写像として描画しています (床の高さにペッタンコのトーラスを描画している)。床からはみ出る部分は、ステンシルバッファを使って描画しないようにしています。

内容

OpenGL は光源による濃淡は計算してくれますが、影までは描いてくれません。ここでは、簡易的に影をつける方法を試してみます。GLUT の examples に影を描くプログラムが含まれていますので、それを参考にします。

影の描画に使う関数は shadowMatrix() と findPlane() です。まず、findPlane で影を描く平面を用意します。

	findPlane(floorPlane, (GLfloat *)floorVertex[0],
	  (GLfloat *)floorVertex[1], (GLfloat *)floorVertex[2]);

引数には平面を受け取る配列、そして床面の 3 点を渡します。そして、影を表現するための変換行列を計算します。

	shadowMatrix(floorShadow, floorPlane, light0Position);

引数には変換行列を受け取る配列、影を描く平面、光源の位置を渡します。最後に、次のように影を描画します。

	glPushMatrix();
	glColor3f(0., 0., 0.);
	glMultMatrixf(&floorShadow[0][0]);
	glTranslatef(0., 0.7, 0.);
	glutSolidTorus(0.1, 0.5, 20, 20);
	glPopMatrix();

変換行列をかけてトーラスを描画することで、トーラスが影のような形で床面に描画されます。影を描くとき、光源は無効にしておきます。

「影」は床をはみ出た部分にも描画されますので、ステンシルバッファを使って描画領域を床のみに制限しています。

OpenGL プログラミング 目次へ