1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
Eigen::Matrix4f get_model_matrix(float rotation_angle) { Eigen::Matrix4f model = Eigen::Matrix4f::Identity(); float r = rotation_angle * MY_PI / 180; Eigen::Matrix4f rotation; rotation << cos(rotation_angle), -sin(rotation_angle), 0, 0, sin(rotation_angle), cos(rotation_angle), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1; model *= rotation; return model; }
Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio, float zNear, float zFar) { Eigen::Matrix4f projection = Eigen::Matrix4f::Identity(); Eigen::Matrix4f M_perspToOrtho(4, 4); Eigen::Matrix4f M_ortho_scale(4, 4); Eigen::Matrix4f M_ortho_trans(4, 4); float half_angle = eye_fov * MY_PI / 360.0; float top = zNear * tan(half_angle); float bottom = -top; float right = top * aspect_ratio; float left = -right; M_ortho_trans << 1, 0, 0, -(right + left) / 2, 0, 1, 0, -(top + bottom) / 2, 0, 0, 1, -(zNear + zFar) / 2, 0, 0, 0, 1; M_ortho_scale << 2 / (right - left), 0, 0, 0, 0, 2 / (top - bottom), 0, 0, 0, 0, 2 / (zNear - zFar), 0, 0, 0, 0, 1; M_perspToOrtho << zNear, 0, 0, 0, 0, zNear, 0, 0, 0, 0, zNear + zFar, -zNear * zFar, 0, 0, 1, 0; Eigen::Matrix4f M_ortho = M_ortho_scale *M_ortho_trans; projection = M_ortho * M_perspToOrtho; return projection; }
|