gluLookAtを置き換える

「gluLookAtを置き換える」の編集履歴(バックアップ)一覧はこちら

gluLookAtを置き換える」(2014/04/16 (水) 18:48:58) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

<p> <strong>gluLookAt を置き換えてみます。</strong></p> <p><strong><img alt="" src="http://www21.atwiki.jp/opengl?cmd=upload&amp;act=open&amp;pageid=133&amp;file=look.png" /></strong></p> <table border="1" cellspacing="1" cellpadding="1" width="600"><tbody><tr><td> <p>#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")<br /> #include &lt;GL/freeglut/freeglut.h&gt;<br /> #include &lt;math.h&gt;</p> <p>#define PI 3.1415926</p> <p>#define WIDTH 320<br /> #define HEIGHT 240</p> <p>//平行移動用<br /> float x = 0.0f;<br /> bool flag = false;<br /> //緑<br /> GLfloat green[] = { 0.0, 1.0, 0.0, 1.0 };<br /> //ライトの位置<br /> GLfloat lightpos[] = { 200.0, 150.0, -500.0, 1.0 };<br /> //単位行列<br /> GLfloat mat[]={<br />  1,0,0,0,<br />  0,1,0,0,<br />  0,0,1,0,<br />  0,0,0,1<br /> };<br /> //平行移動用<br /> GLfloat move[]={<br />  1,0,0,0,<br />  0,1,0,0,<br />  0,0,1,0,<br />  0,0,0,1<br /> };</p> <p>GLfloat modelview[16];<br /> GLfloat multi[16];</p> <p>//合成 glMultMatrixfの代わり<br /> void multiplication(GLfloat* src1,GLfloat* src2,GLfloat* dst)<br /> {<br />  for(int y=0;y&lt;4;y++){<br />   for(int x=0;x&lt;4;x++){<br />    dst[y*4+x]=src2[y*4]*src1[x]+src2[y*4+1]*src1[x+4]+src2[y*4+2]*src1[x+8]+src2[y*4+3]*src1[x+12];<br />   }<br />  }<br /> }<br /> //正規化<br /> void normalize(GLfloat* v){<br />  float m=sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);<br />  if(m &gt; 0.0f){m = 1.0f / m;}else{m = 0.0f;}<br />  v[0]*=m;<br />  v[1]*=m;<br />  v[2]*=m;<br /> }<br /> //外積<br /> void cross( float* src1, float* src2 ,float* dst){<br /> dst[0] = src1[1]*src2[2] - src1[2]*src2[1];<br /> dst[1] = src1[2]*src2[0] - src1[0]*src2[2];<br /> dst[2] = src1[0]*src2[1] - src1[1]*src2[0];<br /> }</p> <p>//gluLookAtと同じ<br /> void LookAt(GLfloat eyex, GLfloat eyey, GLfloat eyez, GLfloat centerx,<br /> GLfloat centery, GLfloat centerz, GLfloat upx, GLfloat upy,<br /> GLfloat upz)<br /> {<br /> float forward[3], side[3], up[3];</p> <p>forward[0] = centerx - eyex;<br /> forward[1] = centery - eyey;<br /> forward[2] = centerz - eyez;</p> <p>up[0] = upx;<br /> up[1] = upy;<br /> up[2] = upz;</p> <p>normalize(forward);</p> <p>cross(forward, up, side);<br /> normalize(side);</p> <p>cross(side, forward, up);</p> <p>GLfloat m[]={<br />  side[0],up[0],-forward[0],0,<br />  side[1],up[1],-forward[1],0,<br />  side[2],up[2],-forward[2],0,<br />  0,0,0,1<br /> };</p> <p>GLfloat mov[]={<br />  1,0,0,0,<br />  0,1,0,0,<br />  0,0,1,0,<br />  -eyex,-eyey,-eyez,1<br /> };</p> <p>multiplication(m,mov,multi);<br /> glLoadMatrixf(multi);<br /> }</p> <p>//gluPerspectiveと同じ<br /> void perspective(float fovy,float aspect,float znear,float zfar)<br /> {<br />  float radian=2*PI*fovy/360.0;<br />  float t = (float)(1.0 / tan(radian/2));<br />  GLfloat m[]={<br />  t / aspect,0,0,0,<br />  0,t,0,0,<br />  0,0,(zfar + znear) / (znear - zfar),-1,<br />  0,0,(2 * zfar * znear) / (znear - zfar),0<br />  };<br />  glLoadMatrixf(m);<br /> }</p> <p>void display(void)<br /> {</p> <p> glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);<br />  glViewport(0, 0, WIDTH, HEIGHT);<br />  glMatrixMode(GL_PROJECTION);</p> <p> //glLoadIdentity();と同じ↓<br />  glLoadMatrixf(mat);</p> <p> //視野角,アスペクト比(ウィンドウの幅/高さ),描画する範囲(最も近い距離,最も遠い距離)<br />  //gluPerspective(30.0, (double)WIDTH / (double)HEIGHT, 1.0, 1000.0);と同じ↓<br />  perspective(30.0, (double)WIDTH / (double)HEIGHT, 1.0, 1000.0);<br />  glMatrixMode(GL_MODELVIEW);</p> <p> //glLoadIdentity();と同じ↓<br />  glLoadMatrixf(mat);</p> <p> //視点の設定<br />  //gluLookAt(150.0,100.0,-200.0,0.0,0.0,0.0,0.0,1.0,0.0);と同じ↓<br />  LookAt(150.0,100.0,-200.0, //カメラの座標<br />       0.0,0.0,0.0, // 注視点の座標<br />      0.0,1.0,0.0); // 画面の上方向を指すベクトル<br />  //ライトの設定<br />  glLightfv(GL_LIGHT0, GL_POSITION, lightpos);<br />  //マテリアルの設定<br />  glMaterialfv(GL_FRONT, GL_DIFFUSE, green);<br />  //平行移動<br />  //glTranslatef(x,0.0f,0.0f);と同じ↓<br />  move[12]=x; //X軸の平行移動成分を設定<br />  //glMultMatrixf(move);と同じ↓<br />  glGetFloatv(GL_MODELVIEW_MATRIX,modelview);<br />  multiplication(modelview,move,multi);<br />  glLoadMatrixf(multi);</p> <p> glutSolidSphere(40.0,16,16);</p> <p> glutSwapBuffers();<br /> }<br /> void idle(void)<br /> {<br />  if(flag){x-=0.05f;}else{x+=0.05f;}<br />  if(x&gt;50.0f)flag=true;<br />  if(x&lt;-50.0f)flag=false;<br />  glutPostRedisplay();<br /> }<br /> void Init(){<br />  glClearColor(0.3f, 0.3f, 0.3f, 1.0f);<br />  glEnable(GL_DEPTH_TEST);<br />  glEnable(GL_LIGHTING);<br />  glEnable(GL_LIGHT0);<br /> }<br /> int main(int argc, char *argv[])<br /> {<br />  glutInitWindowPosition(100, 100);<br />  glutInitWindowSize(WIDTH, HEIGHT);<br />  glutInit(&amp;argc, argv);<br />  glutCreateWindow("gluLookAtを置き換える");<br />  glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);<br />  glutDisplayFunc(display);<br />  glutIdleFunc(idle);<br />  Init();<br />  glutMainLoop();<br />  return 0;<br /> }</p> </td> </tr></tbody></table><p> </p>
<p> <strong>gluLookAt を置き換えてみます。</strong></p> <p><strong><img alt="" src="http://cdn21.atwikiimg.com/opengl?cmd=upload&amp;act=open&amp;pageid=133&amp;file=look.png" /></strong></p> <table border="1" cellpadding="1" cellspacing="1" width="600"><tbody><tr><td> <p>#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")<br /> #include &lt;GL/freeglut/freeglut.h&gt;<br /> #include &lt;math.h&gt;</p> <p>#define PI 3.1415926</p> <p>#define WIDTH 320<br /> #define HEIGHT 240</p> <p>//平行移動用<br /> float x = 0.0f;<br /> bool flag = false;<br /> //緑<br /> GLfloat green[] = { 0.0, 1.0, 0.0, 1.0 };<br /> //ライトの位置<br /> GLfloat lightpos[] = { 200.0, 150.0, -500.0, 1.0 };<br /> //単位行列<br /> GLfloat mat[]={<br />  1,0,0,0,<br />  0,1,0,0,<br />  0,0,1,0,<br />  0,0,0,1<br /> };<br /> //平行移動用<br /> GLfloat move[]={<br />  1,0,0,0,<br />  0,1,0,0,<br />  0,0,1,0,<br />  0,0,0,1<br /> };</p> <p>GLfloat modelview[16];<br /> GLfloat multi[16];</p> <p>//合成 glMultMatrixfの代わり<br /> void multiplication(GLfloat* src1,GLfloat* src2,GLfloat* dst)<br /> {<br />  for(int y=0;y&lt;4;y++){<br />   for(int x=0;x&lt;4;x++){<br />    dst[y*4+x]=src2[y*4]*src1[x]+src2[y*4+1]*src1[x+4]+src2[y*4+2]*src1[x+8]+src2[y*4+3]*src1[x+12];<br />   }<br />  }<br /> }<br /> //正規化<br /> void normalize(GLfloat* v){<br />  float m=sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);<br />  if(m &gt; 0.0f){m = 1.0f / m;}else{m = 0.0f;}<br />  v[0]*=m;<br />  v[1]*=m;<br />  v[2]*=m;<br /> }<br /> //外積<br /> void cross( float* src1, float* src2 ,float* dst){<br /> dst[0] = src1[1]*src2[2] - src1[2]*src2[1];<br /> dst[1] = src1[2]*src2[0] - src1[0]*src2[2];<br /> dst[2] = src1[0]*src2[1] - src1[1]*src2[0];<br /> }</p> <p>//gluLookAtと同じ<br /> void LookAt(GLfloat eyex, GLfloat eyey, GLfloat eyez, GLfloat centerx,<br /> GLfloat centery, GLfloat centerz, GLfloat upx, GLfloat upy,<br /> GLfloat upz)<br /> {<br /> float forward[3], side[3], up[3];</p> <p>forward[0] = centerx - eyex;<br /> forward[1] = centery - eyey;<br /> forward[2] = centerz - eyez;</p> <p>up[0] = upx;<br /> up[1] = upy;<br /> up[2] = upz;</p> <p>normalize(forward);</p> <p>cross(forward, up, side);<br /> normalize(side);</p> <p>cross(side, forward, up);</p> <p>GLfloat m[]={<br />  side[0],up[0],-forward[0],0,<br />  side[1],up[1],-forward[1],0,<br />  side[2],up[2],-forward[2],0,<br />  0,0,0,1<br /> };</p> <p>GLfloat mov[]={<br />  1,0,0,0,<br />  0,1,0,0,<br />  0,0,1,0,<br />  -eyex,-eyey,-eyez,1<br /> };</p> <p>multiplication(m,mov,multi);<br /> glLoadMatrixf(multi);<br /> }</p> <p>//gluPerspectiveと同じ<br /> void perspective(float fovy,float aspect,float znear,float zfar)<br /> {<br />  float radian=2*PI*fovy/360.0;<br />  float t = (float)(1.0 / tan(radian/2));<br />  GLfloat m[]={<br />  t / aspect,0,0,0,<br />  0,t,0,0,<br />  0,0,(zfar + znear) / (znear - zfar),-1,<br />  0,0,(2 * zfar * znear) / (znear - zfar),0<br />  };<br />  glLoadMatrixf(m);<br /> }</p> <p>void display(void)<br /> {</p> <p> glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);<br />  glViewport(0, 0, WIDTH, HEIGHT);<br />  glMatrixMode(GL_PROJECTION);</p> <p> //glLoadIdentity();と同じ↓<br />  glLoadMatrixf(mat);</p> <p> //視野角,アスペクト比(ウィンドウの幅/高さ),描画する範囲(最も近い距離,最も遠い距離)<br />  //gluPerspective(30.0, (double)WIDTH / (double)HEIGHT, 1.0, 1000.0);と同じ↓<br />  perspective(30.0, (double)WIDTH / (double)HEIGHT, 1.0, 1000.0);<br />  glMatrixMode(GL_MODELVIEW);</p> <p> //glLoadIdentity();と同じ↓<br />  glLoadMatrixf(mat);</p> <p> //視点の設定<br />  //gluLookAt(150.0,100.0,-200.0,0.0,0.0,0.0,0.0,1.0,0.0);と同じ↓<br />  LookAt(150.0,100.0,-200.0, //カメラの座標<br />       0.0,0.0,0.0, // 注視点の座標<br />      0.0,1.0,0.0); // 画面の上方向を指すベクトル<br />  //ライトの設定<br />  glLightfv(GL_LIGHT0, GL_POSITION, lightpos);<br />  //マテリアルの設定<br />  glMaterialfv(GL_FRONT, GL_DIFFUSE, green);<br />  //平行移動<br />  //glTranslatef(x,0.0f,0.0f);と同じ↓<br />  move[12]=x; //X軸の平行移動成分を設定<br />  //glMultMatrixf(move);と同じ↓<br />  glGetFloatv(GL_MODELVIEW_MATRIX,modelview);<br />  multiplication(modelview,move,multi);<br />  glLoadMatrixf(multi);</p> <p> glutSolidSphere(40.0,16,16);</p> <p> glutSwapBuffers();<br /> }<br /> void idle(void)<br /> {<br />  if(flag){x-=1.0f;}else{x+=1.0f;}<br />  if(x&gt;50.0f)flag=true;<br />  if(x&lt;-50.0f)flag=false;<br />  Sleep(1);<br />  glutPostRedisplay();<br /> }<br /> void Init(){<br />  glClearColor(0.3f, 0.3f, 0.3f, 1.0f);<br />  glEnable(GL_DEPTH_TEST);<br />  glEnable(GL_LIGHTING);<br />  glEnable(GL_LIGHT0);<br /> }<br /> int main(int argc, char *argv[])<br /> {<br />  glutInitWindowPosition(100, 100);<br />  glutInitWindowSize(WIDTH, HEIGHT);<br />  glutInit(&amp;argc, argv);<br />  glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);<br />  glutCreateWindow("gluLookAtを置き換える");<br />  glutDisplayFunc(display);<br />  glutIdleFunc(idle);<br />  Init();<br />  glutMainLoop();<br />  return 0;<br /> }</p> </td> </tr></tbody></table><p> </p>

表示オプション

横に並べて表示:
変化行の前後のみ表示: