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.

9

Share

Download to read offline

OpenGLと行列

Download to read offline

OpenGL

Related Audiobooks

Free with a 30 day trial from Scribd

See all

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

    Jul. 15, 2015
  • ssuser409a64

    Jun. 18, 2015
  • hiroakikawata35

    Apr. 16, 2014
  • nishinotakashi

    Jul. 3, 2013
  • yogreen

    Jun. 8, 2013
  • kyouheihoshiko

    Feb. 24, 2013
  • ctkawa

    Nov. 3, 2012
  • sma_so

    Aug. 4, 2011
  • chunryo

    Aug. 4, 2011

OpenGL

Views

Total views

9,421

On Slideshare

0

From embeds

0

Number of embeds

56

Actions

Downloads

36

Shares

0

Comments

0

Likes

9

×