SSブログ

Androidアプリ開発 OpenGL フォグ [Android OpenGL]

本日の話題は「フォグ」である。3DCGにおいて、フォグといったテクニックは、遠くにあるものを「霧がかかっているよう」に白っぽく霞ませて表示する手法。

現実世界には、見えないようでいて、実は見えている「空気」というものがある。遠くにある物からの光は、それだけ空気の中を多く進んでやってくる。遠くにある物ほどぼやけた感じに見える。フォグをかければ、より現実に近い世界を表現することが可能になる。

実は、AREarthroidでもフォグをかけようと試みたのではあるが、視点位置が反映されず、フォグの導入は見送っていた。今回、あらためてチャレンジすることにした。

フォグをかけるのは簡単。glEnable(GL_FOG)として有効にすればよい。ただし、フォグのかけ方を指定しないといけない。サンプルでは、とりあえずGL_LINEARのフォグをかけることにする。
さらに、GL_LINEARでは、フォグがかかり始める視点からの距離と、終端の距離を指定する必要がある。
もうひとつ、フォグの色をGL_FOG_COLORで設定する。

			// フォグ
			gl.glEnable(GL10.GL_FOG);
			gl.glFogfv(GL10.GL_FOG_COLOR, black, 0);
			gl.glFogx(GL10.GL_FOG_MODE, GL10.GL_LINEAR);
			gl.glFogf(GL10.GL_FOG_START, 3.0f);
			gl.glFogf(GL10.GL_FOG_END, 10.0f);


フォグの色を背景色と同じ黒にしたので、背景に溶け込むようになっていくはず。
フォグのかかり始めは、後列のドロイド君がいる辺りからに設定。その奥10までいったところで完全に黒になる。

スライドにより左右、上下に視点が移動するが、これだと遠い、近いを制御しずらいので、X軸方向の移動をやめ、Z軸方向に変更する。Y軸方向はそのまま。

	@Override
	public boolean onScroll(MotionEvent event1, MotionEvent event2, float distx, float disty) {
		//eyepos[0] += distx * 0.01;
		eyepos[1] += disty * 0.01;
		eyepos[2] += distx * 0.01;
		return true;
	}


これで、左右にスライドすることで、Z方向に視点が動くようになる。

では、フォグの効果をみてみよう。



ドロイド君を視点から離すと黒くなっていく。逆に近付ければフォグの黒は薄くなっていく。フォグの色を白にすれば、霞んでいくようにみえる。ただ、その場合は背景色も白にしないとおかしいでしょう。


話は変わって、AREarthroidである。AREarthroidでもフォグをかけようとしたのではあるが、視点からの距離ではなく、原点(0,0,0)からの距離でフォグがかかってしまう状況であった。
つまり、視点を変えてもフォグのかかり具合が変化しなかったので、グラデーションはかかっているが、視点位置からの計算になっていないので、「何かおかしい絵柄」になっていた。

フォグのサンプルでも同じようにフォグをかけているし、視点の移動もしている。なんでAREarthroidではできないのじゃ?とデバッグを始めた。

違いは、glLookAtの呼び出しであることがわかった。サンプルでは、

	gl.glMatrixMode(GL10.GL_MODELVIEW);
	gl.glLoadIdentity();
	GLU.gluLookAt(gl, eyepos[0], eyepos[1], eyepos[2], 0, 0, 0, 0, 1, 0);


といった順番で処理を行っている。
AREarthroidでは、GL_MODELVIEWでマトリックスを選択する前で、行っている。本当のコードではないが、以下のような感じ。

	gl.glMatrixMode(GL10.GL_PROJECTION);
	gl.glLoadIdentity();
	GLU.gluPerspective(gl, 50f, aspect, 0.01f, 100f);
	GLU.gluLookAt(gl, eyepos[0], eyepos[1], eyepos[2], 0, 0, 0, 0, 1, 0);
	gl.glRotatef(azimuth, ox, oy, oz);
	gl.glMatrixMode(GL10.GL_MODELVIEW);
	gl.glLoadIdentity();


gluLookAtは、視点用のGL_PROJECTIONマトリックスに対して値を設定するんじゃないの?どうも違うっぽいなぁ。

むむむ。なんとしたことか。

AREarthroidでは、視点を方位で回転させるようなことをしている。じゃないとコンパスにならないから。実際、ちゃんと方角に合わせて地球は回転している。

よくわからんなぁ。

ちょっと順番かえてみよ。

	gl.glMatrixMode(GL10.GL_PROJECTION);
	gl.glLoadIdentity();
	GLU.gluPerspective(gl, 50f, aspect, 0.01f, 100f);
	gl.glMatrixMode(GL10.GL_MODELVIEW);
	gl.glLoadIdentity();
	GLU.gluLookAt(gl, eyepos[0], eyepos[1], eyepos[2], 0, 0, 0, 0, 1, 0);
	gl.glRotatef(azimuth, ox, oy, oz);


おお、これでも同じように表示されるじゃないか。しかし、なんか微妙に違うかも...
むしろ、いい感じになっている。

じゃあこれでフォグかけたら... あら真っ白。開始、終了距離を調整して...

あらま。ちゃんとフォグがかかった。

あー、またバージョンアップせねば。



サイト内を検索

nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。



Copyright Atsushi Asai Google+朝井淳
[改訂第4版]SQLポケットリファレンス

[改訂第4版]SQLポケットリファレンス

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/18
  • メディア: 単行本(ソフトカバー)

イラストで理解 SQL はじめて入門

イラストで理解 SQL はじめて入門

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2019/05/16
  • メディア: 単行本(ソフトカバー)

[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)

[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/03/03
  • メディア: 単行本(ソフトカバー)

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2018/05/25
  • メディア: 大型本

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。