OpenGLと行列について<br />narrative nights 株式会社<br />三好康祐<br />
今回の目標<br />OpenGLがどうやって表示を行っているかのフローについて理解する<br />行列のイメージをつかむ<br />Zバッファについて理解する<br />
OpenGLは何をしてくれる?<br />3次元の座標値をいっぱい与えると<br />しかるべき変換作業を行って<br />座標変換したり<br />テクスチャ張ったり<br />ライトを当てたり etc…<br />端末の画面に表示をしてくれ...
行列<br />glPushMatrix(),  glPopMatrix(), glMatrixMode() etc..<br />PROJECTION_MODE, MODELVIEW_MODEって何だろう?<br />良く出てくるMatrix...
算数での簡単な例<br />{13, 4,  15,  6,  12,  1, …..,  23}<br />といった様に、適当な数字が10個ある<br />これら1個1個に対して、5倍して3を足した値<br />それぞれ求めなさい<br />
Javaで書くと<br />int numbers[] = {13, 4, 15, 6, 12, 1,..., 23};<br />for(int i=0; i<10; ++i) {<br />  int num = numbers[i];<b...
もう少し難しくした例<br />{13,4, 15, 6, 12, 1….. 23}<br />という10個の数字があって<br />これら1個1個に対して、<br />・5倍して3を足し、<br />・その結果を、2倍して、1を引き<br /...
Javaで書くと<br />int numbers[] = {13, 4, 15, 6, 12, 1,..., 23};<br />for(int i=0; i<10; ++i) {<br />  int num = numbers[i];<b...
<ul><li> 5倍して3を足し
 2倍して、1を引き
 4倍して、6を足す</li></ul>a’ = 4 × (2 ×(5 × a + 3) -1) + 6<br />↓<br />      a’ = 4 × ((10× a + 6) -1) + 6<br />↓<br />      a’ ...
for(int i=0; i<10; ++i) {<br />  int num = numbers[i];<br />int num2 = num * 5 + 3;<br />  int num3 = num2 * 2 - 1;<br /> ...
3Dでの例<br />8頂点分の座標があったとして<br />float vertex[] = {<br />	-1.0f, -1.0f,  1.0f, // x,y,z<br />	 1.0f, -1.0f,  1.0f,<br />	 1....
それらの8頂点に対して、<br />(-1,0,0)だけ移動して<br />x,y,z成分をそれぞれ2倍して<br />X軸を中心に、45度回転させて<br />回転した状態から(0,5,0)だけ移動したら<br />それぞれの座標値はどこにな...
移動、回転、拡縮といった変換は、それぞれ行列によって表現できる<br />例) x、y、zをそれぞれ2.0倍する変換<br />x<br />y<br />Z<br />1<br />2<br />0<br />0<br />0<br />0<...
(-1,0,0) 移動<br />X軸45度回転<br />(0,5,0)移動<br />2倍<br />x<br />y<br />z<br />×<br />×<br />×<br />×<br />x<br />y<br />z<br /...
OpenGL内の行列<br />OpenGLは内部に、二つ行列を1個ずつ持っている<br />PROJECTION行列<br />MODEL_VIEW行列<br />それぞれ何をする為の行列なんだろう?<br />
gl.glMatrixMode(GL10.GL_PROJECTION); <br />//↑これから呼び出すMatrix用命令は、PROJECTION 行列に対して行う<br />gl.glLoadIdentity();// 行列を初期化<br...
PROJECTION行列<br />Projection = 投影<br />投影= 3次元上の点を2次元の平面上の点に写す<br />
パース付きPROJECTION行列<br />glFrustumf()にて行列を生成<br />パース = 奥行き感<br />奥行き感 = 遠くの物ほど小さく見せる<br /> <br />どれくらい小さく見せるか、で遠近感を調整<br />
glFrustumf(-1.5f,1.5f, -1.0f, 1.0f, 1.0f, 10.0f);<br />広角レンズ<br />glFrustumf(-0.75f,0.75f, -0.5f,0.5f, 1.0f, 30.0f);<br />...
パース無しPROJECTION行列<br />glOrthof()で行列を生成<br />パースが無い = 奥行き感が無い<br />奥行き感が無い = 遠くに行っても大きさ同じ<br />
パースが無い状態で、真正面から見たら?<br />2DのUI表示はこの方式で表示している<br />
MODELVIEW行列<br />モノの位置やカメラの位置を表現する為の行列<br />gl.glTranslatef(0, 0, -3.0f);// 移動して<br />gl.glScalef(2.0f, 2.0f, 2.0f);  // 拡...
glScalef()<br />glTranslatef()<br />glRotatef()<br />x<br />y<br />z<br />×<br />×<br />×<br />x<br />y<br />z<br />×<br /...
glPushMatrix()glPopMatrix()<br />現在のMODELVIEW 行列 (=現在まで掛け合わされた行列の結果)を、<br />glPushMatrix()で保存<br />glPopMatrix()で復元<br />
画面に表示されるまで<br />PROJECTION行列<br />MODELVIEW行列<br />VIEWPORT変換行列<br />x’<br />y’<br />z’<br />x<br />y<br />z<br />画面上の<br ...
Zバッファ<br />画面上の各ピクセルの座標値<br />x’ <br />y’<br />z’<br />さっき使わなかった奥行き値=zデプス値だけを全ピクセル分記録している場所がある<br /> <br />=  Zバッファ(depthバ...
Upcoming SlideShare
Loading in …5
×

OpenGLと行列

8,431 views

Published on

OpenGL

0 Comments
9 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
8,431
On SlideShare
0
From Embeds
0
Number of Embeds
50
Actions
Shares
0
Downloads
31
Comments
0
Likes
9
Embeds 0
No embeds

No notes for slide

OpenGLと行列

  1. 1. OpenGLと行列について<br />narrative nights 株式会社<br />三好康祐<br />
  2. 2. 今回の目標<br />OpenGLがどうやって表示を行っているかのフローについて理解する<br />行列のイメージをつかむ<br />Zバッファについて理解する<br />
  3. 3. OpenGLは何をしてくれる?<br />3次元の座標値をいっぱい与えると<br />しかるべき変換作業を行って<br />座標変換したり<br />テクスチャ張ったり<br />ライトを当てたり etc…<br />端末の画面に表示をしてくれる<br /> (=ピクセルを1個ずつプチプチ打ってくれる)<br />
  4. 4. 行列<br />glPushMatrix(),  glPopMatrix(), glMatrixMode() etc..<br />PROJECTION_MODE, MODELVIEW_MODEって何だろう?<br />良く出てくるMatrix(=行列)って一体何だろう?<br />行列ってそもそも何の為に必要なんだろう?<br />
  5. 5. 算数での簡単な例<br />{13, 4, 15, 6, 12, 1, ….., 23}<br />といった様に、適当な数字が10個ある<br />これら1個1個に対して、5倍して3を足した値<br />それぞれ求めなさい<br />
  6. 6. Javaで書くと<br />int numbers[] = {13, 4, 15, 6, 12, 1,..., 23};<br />for(int i=0; i<10; ++i) {<br /> int num = numbers[i];<br />int num2 = num * 5 + 3;<br />System.out.println(num2);<br />}<br />
  7. 7. もう少し難しくした例<br />{13,4, 15, 6, 12, 1….. 23}<br />という10個の数字があって<br />これら1個1個に対して、<br />・5倍して3を足し、<br />・その結果を、2倍して、1を引き<br />・その結果にさらに、4倍して、6を足した結果は?<br />
  8. 8. Javaで書くと<br />int numbers[] = {13, 4, 15, 6, 12, 1,..., 23};<br />for(int i=0; i<10; ++i) {<br /> int num = numbers[i];<br />int num2 = num * 5 + 3;<br /> int num3 = num2 * 2 - 1;<br /> int num4 = num3 * 4 + 6;<br />System.out.println(num4);<br />}<br />
  9. 9. <ul><li> 5倍して3を足し
  10. 10. 2倍して、1を引き
  11. 11. 4倍して、6を足す</li></ul>a’ = 4 × (2 ×(5 × a + 3) -1) + 6<br />↓<br /> a’ = 4 × ((10× a + 6) -1) + 6<br />↓<br /> a’ = 40× a + 24 - 4 + 6<br />↓<br /> a’ = 40× a + 26<br />
  12. 12. for(int i=0; i<10; ++i) {<br /> int num = numbers[i];<br />int num2 = num * 5 + 3;<br /> int num3 = num2 * 2 - 1;<br /> int num4 = num3 * 4 + 6;<br />}<br />           <br />for(int i=0; i<10; ++i) {<br /> int num = numbers[i];<br /> int num2 = num * 40 + 26; <br />}<br />1回にまとまる!<br />
  13. 13. 3Dでの例<br />8頂点分の座標があったとして<br />float vertex[] = {<br /> -1.0f, -1.0f, 1.0f, // x,y,z<br /> 1.0f, -1.0f, 1.0f,<br /> 1.0f, 1.0f, 1.0f,<br /> -1.0f, 1.0f, 1.0f,<br /> 1.0f, -1.0f, -1.0f,<br /> -1.0f, -1.0f, -1.0f,<br /> -1.0f, 1.0f, -1.0f,<br /> 1.0f, 1.0f, -1.0f<br />};<br />
  14. 14. それらの8頂点に対して、<br />(-1,0,0)だけ移動して<br />x,y,z成分をそれぞれ2倍して<br />X軸を中心に、45度回転させて<br />回転した状態から(0,5,0)だけ移動したら<br />それぞれの座標値はどこになる?<br />
  15. 15. 移動、回転、拡縮といった変換は、それぞれ行列によって表現できる<br />例) x、y、zをそれぞれ2.0倍する変換<br />x<br />y<br />Z<br />1<br />2<br />0<br />0<br />0<br />0<br />2<br />0<br />0<br />0<br />0<br />2<br />0<br />0<br />0<br />0<br />1<br />2x<br />2y<br />2Z<br />1<br />×<br />
  16. 16. (-1,0,0) 移動<br />X軸45度回転<br />(0,5,0)移動<br />2倍<br />x<br />y<br />z<br />×<br />×<br />×<br />×<br />x<br />y<br />z<br />×<br />1個にまとめられる!<br />現在の複雑な状態が1個の行列で表現できる<br />
  17. 17. OpenGL内の行列<br />OpenGLは内部に、二つ行列を1個ずつ持っている<br />PROJECTION行列<br />MODEL_VIEW行列<br />それぞれ何をする為の行列なんだろう?<br />
  18. 18. gl.glMatrixMode(GL10.GL_PROJECTION); <br />//↑これから呼び出すMatrix用命令は、PROJECTION 行列に対して行う<br />gl.glLoadIdentity();// 行列を初期化<br />gl.glFrustumf(-1,1, -1.5, 1.5, 1, 10);<br />gl.glMatrixMode(GL10.GL_MODELVIEW);<br />//↑これから呼び出すMatrix用命令は、MODELVIEW 行列に対して行う<br />gl.glLoadIdentity(); // 行列を初期化<br />gl.glTranslatef(0, 0, -3.0f);<br />gl.glScalef(0.5f, 0.5f, 0.5f);<br />gl.glRotatef(45, 0, 1, 0);<br />同じglLoadIdentity()の呼び出しでも意味が違ってくる<br />
  19. 19. PROJECTION行列<br />Projection = 投影<br />投影= 3次元上の点を2次元の平面上の点に写す<br />
  20. 20. パース付きPROJECTION行列<br />glFrustumf()にて行列を生成<br />パース = 奥行き感<br />奥行き感 = 遠くの物ほど小さく見せる<br /> <br />どれくらい小さく見せるか、で遠近感を調整<br />
  21. 21. glFrustumf(-1.5f,1.5f, -1.0f, 1.0f, 1.0f, 10.0f);<br />広角レンズ<br />glFrustumf(-0.75f,0.75f, -0.5f,0.5f, 1.0f, 30.0f);<br />望遠レンズ<br />画角が大きい=遠くになるとすぐ小さくなる<br />画角が小さい=遠く離れてもあまり小さくならない<br />
  22. 22. パース無しPROJECTION行列<br />glOrthof()で行列を生成<br />パースが無い = 奥行き感が無い<br />奥行き感が無い = 遠くに行っても大きさ同じ<br />
  23. 23. パースが無い状態で、真正面から見たら?<br />2DのUI表示はこの方式で表示している<br />
  24. 24. MODELVIEW行列<br />モノの位置やカメラの位置を表現する為の行列<br />gl.glTranslatef(0, 0, -3.0f);// 移動して<br />gl.glScalef(2.0f, 2.0f, 2.0f);  // 拡大して<br />gl.glRotatef(45, 0, 1, 0);      // 回転<br />
  25. 25. glScalef()<br />glTranslatef()<br />glRotatef()<br />x<br />y<br />z<br />×<br />×<br />×<br />x<br />y<br />z<br />×<br />OpenGL内では1個の行列(=MODELVIEW行列)<br />にまとめられている<br />
  26. 26. glPushMatrix()glPopMatrix()<br />現在のMODELVIEW 行列 (=現在まで掛け合わされた行列の結果)を、<br />glPushMatrix()で保存<br />glPopMatrix()で復元<br />
  27. 27. 画面に表示されるまで<br />PROJECTION行列<br />MODELVIEW行列<br />VIEWPORT変換行列<br />x’<br />y’<br />z’<br />x<br />y<br />z<br />画面上の<br />座標値<br />×<br />×<br />×<br />※-1.0~1.0 といった座標系から0~320と<br />いった実際のピクセル単位での座標系に<br />変換する為の行列<br />
  28. 28. Zバッファ<br />画面上の各ピクセルの座標値<br />x’ <br />y’<br />z’<br />さっき使わなかった奥行き値=zデプス値だけを全ピクセル分記録している場所がある<br /> <br />= Zバッファ(depthバッファ)<br />
  29. 29. Depth Test<br />Zバッファ<br />あるピクセルを描こうとした時に既に記憶されていたピクセルのZ値と比較する<br /><ul><li>奥にあれば、ピクセルを描かない
  30. 30. 手前にあるなら、ピクセルを描き、Zバッファ値を更新</li></li></ul><li>Next Step<br />移動,回転,拡縮行列の実際の中身の理解を深める<br />-> 3D処理全般応用力が高まる<br />glDrawArray(), glDrawElements(), TRIANGLE_STRIP, VERTEX_BUFFER_OBJECT, etc…等の実際の表示部分の理解を深める<br />->効率的な表示ができるようになる<br />ピクセルが1個ずつ打たれるというイメージを元に<br />-> αブレンディングに関する理解を深める<br />

×