Engine
perspective.h
1  #include "Eigen/Core"
2 
3 template<class T>
4 Eigen::Matrix<T,4,4> perspective
5 (
6  GLfloat fovy,
7  GLfloat aspect,
8  GLfloat zNear,
9  GLfloat zFar
10 )
11 {
12  assert(aspect > 0);
13  assert(zFar > zNear);
14 
15  GLfloat radf = (M_PI/180.0)*fovy;
16 
17  GLfloat tanHalfFovy = tan(radf / 2.0);
18  Eigen::Matrix<T,4,4> res = Eigen::Matrix<T,4,4>::Zero();
19  res(0,0) = 1.0 / (aspect * tanHalfFovy);
20  res(1,1) = 1.0 / (tanHalfFovy);
21  res(2,2) = - (zFar + zNear) / (zFar - zNear);
22  res(3,2) = - 1.0;
23  res(2,3) = - (2.0 * zFar * zNear) / (zFar - zNear);
24  return res;
25 }