Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

OpenGLと行列

OpenGL

  • Be the first to comment

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 />

    Be the first to comment

    Login to see the comments

  • chunryo

    Aug. 4, 2011
  • sma_so

    Aug. 4, 2011
  • ctkawa

    Nov. 3, 2012
  • kyouheihoshiko

    Feb. 24, 2013
  • yogreen

    Jun. 8, 2013
  • nishinotakashi

    Jul. 3, 2013
  • hiroakikawata35

    Apr. 16, 2014
  • ssuser409a64

    Jun. 18, 2015
  • kymstk54

    Jul. 15, 2015

OpenGL

Views

Total views

9,403

On Slideshare

0

From embeds

0

Number of embeds

56

Actions

Downloads

36

Shares

0

Comments

0

Likes

9

×